Запись файлов AVI в OpenCV
Вот пример в сети и код, приведенный в разделе "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);
}
Ответы
Ответ 1
Моя ставка заключается в том, что cvCreateVideoWriter возвращает NULL. Просто пройдите через него, чтобы убедиться, что это правда. В этом случае проблема, вероятно, связана с CV_FOURCC (..), которая не находит кодек и принудительно возвращает 0;
вы можете попробовать использовать -1 вместо CV_FOURCC. Во время выполнения во время выполнения будет предложено выбрать соответствующий кодек
Ответ 2
Когда я решаю эту проблему, я отвечаю на вопрос: "OpenCV на mac os x don`t поддерживает avi write, пока он не будет скомпилирован с помощью ffmpeg"
Мне кажется, что это решение
http://article.gmane.org/gmane.comp.lib.opencv/16005
Вам необходимо предоставить полный путь к файл с фильмом в cvCreateVideoWriter. Я не знаю будь то только порт Mac OS X но может быть, поскольку QTNewDataReferenceFromFullPathCFString из бэкэнда QT.
Ответ 3
hey Этот код работает в DevС++, попробуйте:
#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;
}
Я скомпилировал его и запустил, отлично работает.
(Я не видел выше, получил ли вы свой ответ или нет... но для этой конкретной вещи я работал очень тяжело раньше, и вдруг я просто сделал это, из некоторых фрагментов кода.)
Ответ 4
Это проблема кодека. Попробуйте все возможные кодеки (опция -1
в cvCreateVideo
). В моем случае Microsoft Video 1
работал хорошо.
Ответ 5
Может быть, вы можете попробовать вставить 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" );
Затем посмотрите, есть ли у вас какие-либо окна, и если они содержат правильное содержимое.
Ответ 6
Этот код работал нормально:
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;
}
Ответ 7
Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что цикл "for" никогда не заканчивается; поэтому cvReleaseVideoWriter(&writer);
и cvReleaseCapture(&input);
никогда не вызываются. Попробуйте что-то вроде for(int i=0; i<200; i++)
и посмотрите, закончите ли вы с рабочим видео.
Часто видео записывается во временные файлы перед завершением работы на диске. Если ваш файл не завершен, увидеть нечего.
Надеюсь, что это поможет.