Comment écrire un fichier vidéo avec OpenCV?
Je suis en train d'écrire un programme pour analyser les expressions émotionnelles comme des larmes. Dans le cadre de mon tracker je suis à l'aide d'OpenCV pour enregistrer des exemples de vidéos. En particulier, je ne suis pas certain de comment bien choisir un FPS (10FPS semble que ça devrait marcher). Je suis également pas sûr de la
Codec que je devrais utiliser sous OS X, j'ai essayé tout ce qui était possible CV_FOURCC de ici, mais a renvoyé l'erreur suivante:
Stream #0.0: Video: rawvideo, yuv420p, 640x480, q=2-31, 19660 kb/s, 90k tbn, 10 tbc
Assertion failed: (image->imageSize == avpicture_get_size( (PixelFormat)input_pix_fmt, image->width, image->height )), function writeFrame, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_graphics_opencv/work/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp, line 1085.
Avez-vous tous avoir un code qui fonctionne avec cvWriteFrame? Merci de prendre le temps de regarder mon problème!
Pour ceux qui s'intéressent à l'ensemble du programme est:
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main (int argc, const char * argv[])
{
CvCapture *capture;
IplImage *img;
int key = 0;
CvVideoWriter *writer;
//initialize camera
capture = cvCaptureFromCAM( 0 );
//capture = cvCaptureFromAVI("AVIFile");
//always check
assert( capture );
//create a window
cvNamedWindow( "video", 1 );
int color = 1; //0 for black and white
//get the frame size
CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
writer = cvCreateVideoWriter(argv[1], -1 , 10 , size, color);
while( key != 'q' ) {
//get a frame
img = cvQueryFrame( capture );
//always check
if( !img ) break;
cvWriteFrame( writer, img );
cvShowImage("video", img );
//quit if user press 'q'
key = cvWaitKey( 5 );
}
//free memory
cvReleaseVideoWriter( &writer );
cvReleaseCapture( &capture );
cvDestroyWindow( "video" );
return 0;
}
source d'informationauteur CCS
Vous devez vous connecter pour publier un commentaire.
Ont un look ici pour les codecs à utiliser.
En gros:
-1
au lieu deCV_FOURCC(...)
que si vous êtes sur Windows (voir la manuel). Puisque vous êtes sur OSX, vous ne pouvez pas l'utiliser.CV_FOURCC('I', 'Y', 'U', 'V')
à coder à l'aide de yuv420p dans un AVI non compressé contenant, ce qui est l'approche recommandéeffmpeg
pour compresser le fichier AVI de sortie par OpenCVLa raison OpenCV ne recommande pas d'utiliser le compresseur d'codecs est probablement parce que chaque codec a un grand nombre de codec options spécifiques, et de traiter avec eux tous par la simple utilisation d'OpenCV vidéo écrivain interface serait impossible.
MODIFIER
J'ai quelques mauvaise nouvelle:
Dirait que vous devrez peut-être reconfigurer et recompiler votre bibliothèque.
EDIT 2
Alternativement, vous pouvez simplement écrire chaque image à un fichier JPEG, et puis la couture de ces fichiers JPEG dans un film à l'aide de
ffmpeg
(qui devrait fonctionner sur OS/X). C'est essentiellement ce que le MJPEG est, de toute façon. Vous aurez probablement obtenir un meilleur taux de compression avec les codecs qui exploitent la redondance temporelle (par exemple, MPEG4, H. 264, etc), bien que.L'affirmation suggère qu'il existe une différence de taille entre l'image d'être envoyé à la vidéo de l'écrivain, et la taille spécifiée lors de l'initialisation de la vidéo de l'écrivain. Je vous suggère d'ajouter quelques instructions de débogage comme suit:
Qui devrait vous aider à savoir si les tailles sont différentes.
À l'égard de la fourcc question, il semble que vous utilisez cap_ffmpeg au lieu de cap_qtkit. Vous pouvez essayer de recompiler avec ffmpeg, étant donné que la qtkit version de capture fonctionne assez bien sur OS X. Plutôt que d'utiliser macports, vous pouvez télécharger directement opencv2.2 à partir de sourceforge et l'utilisation ccmake pour configurer opencv ne pas utiliser ffmpeg, dans ce cas qtkit sera la valeur par défaut.
Si vous n'utilisez qtkit, alors vous devez utiliser le fourcc('j','p','e','g');
Le taux de trame doit correspondre à la fréquence d'image de l'entrée. Vous pouvez utiliser les propriétés afin d'obtenir le taux de trame similaire à la façon dont vous avez obtenu le cadre de la largeur et de la hauteur, cependant, puisque vous êtes la capture de la caméra, vous aurez probablement à tester le taux de capture en utilisant un timer dans votre code et de l'estimation.
Voici un exemple basé sur starter_video.cpp qui va travailler avec qtkit:
J'ai eu le même problème.
Je l'ai résolu en utilisant le plan RVB Codec.
La taille de sortie est important, mais il fonctionne sans rien installer.
Je pense que c'est à cause de la taille de la vidéo - essayez d'autres, les plus communs comme
640X480
ou320X240
.Cela fonctionne pour moi.
Je pense que le
CV_FOURCC
ligne est peut-être incorrect. Un question similaire suggère d'utiliser-1
comme unCV_FOURCC
valeur de test pour vous proposer le travail de choix sur votre système.Pouvez-vous essayer de compiler le programme de cette question et dites-nous si à l'aide d'une valeur de
-1
au lieu deV_FOURCC('M', 'J', 'P', 'G')
écrit un fichier AVI?Après la lecture de misha réponse.
J'ai résolu ce problème sous Mac OS 10.9 Mavericks et XCode 5 par réinstaller à l'aide d'opencv Homebrew.
brew installer opencv --with-ffmpeg