在 OpenCV 中编写 AVI 文件
Posted
技术标签:
【中文标题】在 OpenCV 中编写 AVI 文件【英文标题】:Writing AVI files in OpenCV 【发布时间】:2010-09-27 00:09:00 【问题描述】:网上有例子和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);
【问题讨论】:
如果 Eric 提供了正确的答案,您能否接受他的答案作为该问题的正确答案? 您在哪个平台上运行?我无法让 MJPG 在 Windows 上运行。 【参考方案1】:我敢打赌 cvCreateVideoWriter 返回 NULL。只需一步一步,看看它是否属实。在这种情况下,问题可能出在 CV_FOURCC(..) 上,它没有找到编解码器并强制返回 0;
您可以尝试使用 -1 而不是 CV_FOURCC。运行时会提示您选择合适的编解码器
【讨论】:
【参考方案2】:当我在谷歌上搜索这个问题时,我遇到了一个答案:“Mac os x 上的 OpenCV 不支持 avi 写入,直到它将使用 ffmpeg 编译”
对我来说似乎解决了这个问题 http://article.gmane.org/gmane.comp.lib.opencv/16005
您需要提供完整路径 包含电影的文件 cvCreateVideoWriter。我不知道 是否只是 Mac OS X 端口 问题,但可能是,因为 QTNewDataReferenceFromFullPathCFString 使用来自 QT 后端。
【讨论】:
是否支持在windows上写?【参考方案3】:嘿,这段代码在 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;
我编译并运行它,工作正常。 (我没有在上面看到你是否得到了你的答案.. 但是对于这个特殊的事情我很早以前就非常努力地工作,突然我就从一些代码 sn-ps 中做到了。)
【讨论】:
【参考方案4】:这是一个编解码器问题。尝试所有可能的编解码器(cvCreateVideo
中的选项 -1
)。就我而言,Microsoft Video 1
运行良好。
【讨论】:
【参考方案5】:也许您可以尝试在 for(;;) 中插入 printf("Frame found\n") 以查看它是否真的在捕获帧。甚至更好:
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++)
之类的方法,看看你是否最终得到了一个有效的视频。
视频通常会在最终写入磁盘之前写入临时文件。如果您的文件未最终确定,则将看不到任何内容。
希望对您有所帮助。
【讨论】:
以上是关于在 OpenCV 中编写 AVI 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中使用 openCV 的 VideoCapture 方法打开和处理 .mpeg 或 .avi 等视频文件