Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenCV中编写AVI文件_C_Video_Opencv_Avi - Fatal编程技术网

在OpenCV中编写AVI文件

在OpenCV中编写AVI文件,c,video,opencv,avi,C,Video,Opencv,Avi,网上有一个例子,在Oriely的学习OpenCv中给出了代码 多次尝试后,out.avi文件以0字节写入。 我不知道我哪里出错了 以下是我使用的代码 int main(int argc, char* argv[]) { CvCapture* input = cvCaptureFromFile(argv[1]); IplImage* image = cvRetrieveFrame(input); if (!image) { printf("Unable t

网上有一个例子,在Oriely的学习OpenCv中给出了代码

多次尝试后,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);

}

也许您可以尝试在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" );

然后查看是否有任何窗口,以及它们是否包含正确的内容。

我打赌cvCreateVideoWriter返回空值。只要仔细检查一下,看看是不是真的。在这种情况下,问题可能是CV_FOURCC(..)没有找到编解码器并强制返回0


您可以尝试使用-1而不是CV_FOURCC。在运行时会有一个提示,提示您选择合适的编解码器。当我搜索这个问题时,我遇到了一个答案:“mac os x上的OpenCV在使用ffmpeg编译之前不支持avi写入”

对我来说,这似乎是一种解决办法

您需要提供到的完整路径 电影所在的文件 我是一个视频写手。我不知道 是否只是一个Mac OS X端口 问题,但可能是,因为 QTNewDataReferenceFromFullPathCFString 从QT后端开始使用


嘿,这段代码在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;
  }
#包括
#包括
#包括
#包括
#包括
int main()
{
CvVideoWriter*writer=0;
int isColor=1;
int fps=5;//或30
int frameW=1600;//640;//744用于firewire摄像机
int frameH=1200;//480;//480用于firewire摄像机
//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);//将帧添加到文件中
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);
返回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;
}
cv.h
highgui.h
cvaux.h
cvcam.h
cxcore.h
int main(){
CvVideoWriter*writer=0;
int isColor=1;
int fps=5;//或30
IplImage*img=0;
img=cvLoadImage(“animTest_1.bmp”);
int frameW=img->width;//640;//744用于firewire摄像机
int frameH=img->height;//480;//480用于firewire摄像机
writer=cvCreateVideoWriter(“out.avi”,-1,
fps,cvSize(frameW,frameH),1;
cvWriteFrame(writer,img);//将帧添加到文件中
char*FirstFile,fF[20]=“”,*filenoster,fns[4]=“”;
filenoster=fns;

for(int fileNo;fileNo我想你遇到的问题是你的“for”循环永远不会结束;因此,
cvReleaseVideoWriter(&writer);
cvReleaseCapture(&input);
永远不会被调用。尝试类似于
for(int I=0;I的方法这是一个编解码器问题。尝试所有可能的编解码器(选项
-1
cvCreateVideo
中)。在我的情况下,Microsoft Video
1
工作得很好。

如果Eric提供了正确的答案,您是否可以接受他的答案作为问题的正确答案?您运行的是什么平台?我在让MJPGs在windows上工作时遇到问题。它支持在windows上写吗?