Есть пример в сети и код, приведенный в Learn OpenCv, Orielly.
После многих попыток в файл out.avi записывается 0 байтов. Интересно, где я ошибся.
Ниже приведен код, который я использовал ...
int main(int argc, char* argv[]) {
CvCapture* input = cvCaptureFromFile(argv[1]);
IplImage* image = cvRetrieveFrame(input);
if (!image) {
printf("Unable to read input");
return 0;
}
CvSize imgSize;
imgSize.width = image->width;
imgSize.height = image->height;
double fps = cvGetCaptureProperty(
input,
CV_CAP_PROP_FPS
);
CvVideoWriter *writer = cvCreateVideoWriter(
"out.avi",
CV_FOURCC('M', 'J', 'P', 'G'),
fps,
imgSize
);
IplImage* colourImage;
//Keep processing frames...
for (;;) {
//Get a frame from the input video.
colourImage = cvQueryFrame(input);
cvWriteFrame(writer, colourImage);
}
cvReleaseVideoWriter(&writer);
cvReleaseCapture(&input);
}
На какой платформе вы работаете? Мне не удалось заставить MJPG работать в Windows.





Возможно, вы могли бы попробовать вставить printf ("Frame found \ n") внутри for (;;), чтобы увидеть, действительно ли он захватывает кадры. Или даже лучше:
if (colourImage == NULL) {
printf("Warning - got NULL colourImage\n");
continue;
}
cvNamedWindow( "test", 1);
cvShowImage( "test", colourImage );
cvWaitKey( 0 );
cvDestroyWindow( "test" );
Затем посмотрите, есть ли у вас какие-либо окна и содержат ли они правильное содержимое.
Я уверен, что cvCreateVideoWriter вернет NULL. Просто пройдите через это, чтобы убедиться, что это правда. В этом случае проблема, вероятно, связана с CV_FOURCC (..), который не находит кодек и принудительно возвращает 0;
вы можете попробовать использовать -1 вместо CV_FOURCC. Во время выполнения вам будет предложено выбрать соответствующий кодек.
Когда я гуглил эту проблему, я встречал ответ: «OpenCV в mac os x не поддерживает запись в формате avi, пока он не будет скомпилирован с помощью ffmpeg».
Для меня кажется, что это решение http://article.gmane.org/gmane.comp.lib.opencv/16005
You need to provide the full path to the file with the movie in cvCreateVideoWriter. I don't know whether it's only an Mac OS X port issue, but might be, since QTNewDataReferenceFromFullPathCFString from the QT backend is used.
Поддерживает ли он запись в окнах?
эй Этот код работает на DevC++, попробуйте:
#include<cv.h>
#include<highgui.h>
#include<cvaux.h>
#include<cvcam.h>
#include<cxcore.h>
int main()
{
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 5; // or 30
int frameW = 1600; //640; // 744 for firewire cameras
int frameH = 1200; //480; // 480 for firewire cameras
//writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),
// fps,cvSize(frameW,frameH),isColor);
writer=cvCreateVideoWriter("out.avi",-1,
fps,cvSize(frameW,frameH),isColor);
IplImage* img = 0;
img=cvLoadImage("CapturedFrame_0.jpg");
cvWriteFrame(writer,img); // add the frame to the file
img=cvLoadImage("CapturedFrame_1.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_2.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_3.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_4.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_5.jpg");
cvWriteFrame(writer,img);
cvReleaseVideoWriter(&writer);
return 0;
}
Скомпилировал и запустил, работает нормально. (Я не видел выше, получили ли вы свой ответ или нет ... но для этой конкретной вещи я очень много работал раньше, и внезапно я просто сделал это из некоторых фрагментов кода.)
Этот код работал нормально:
cv.h
highgui.h
cvaux.h
cvcam.h
cxcore.h
int main(){
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 5; // or 30
IplImage* img = 0;
img=cvLoadImage("animTest_1.bmp");
int frameW = img->width; //640; // 744 for firewire cameras
int frameH = img->height; //480; // 480 for firewire cameras
writer=cvCreateVideoWriter("out.avi",-1,
fps,cvSize(frameW,frameH),1);
cvWriteFrame(writer, img); // add the frame to the file
char *FirstFile,fF[20] = "",*fileNoStr,fns[4] = "";
fileNoStr=fns;
for(int fileNo;fileNo<100;fileNo++){
FirstFile=fF;
itoa(fileNo,fileNoStr,10);
FirstFile=strcat ( FirstFile,"animTest_");
FirstFile=strcat ( FirstFile,fileNoStr);
FirstFile=strcat ( FirstFile,".bmp");
printf(" \n%s .",FirstFile);
img=cvLoadImage(FirstFile);
cvWriteFrame(writer, img);
}
cvReleaseVideoWriter(&writer);
return 0;
}
Я думаю, что проблема, с которой вы столкнулись, заключается в том, что ваш цикл «for» никогда не заканчивается; следовательно, cvReleaseVideoWriter(&writer); и cvReleaseCapture(&input); никогда не вызываются. Попробуйте что-нибудь вроде for(int i=0; i<200; i++) и посмотрите, получится ли у вас рабочее видео.
Часто видео записывается во временные файлы перед финализацией на диске. Если ваш файл не финализирован, вам не на что будет смотреть.
Надеюсь, это поможет.
Это проблема кодека. Попробуйте все возможные кодеки (опция -1 в cvCreateVideo). В моем случае хорошо сработал Microsoft Video 1.
Если Эрик дал правильный ответ, не могли бы вы принять его ответ как правильный на вопрос?