【问题标题】:Writing AVI files in OpenCV在 OpenCV 中编写 AVI 文件
【发布时间】: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 上运行。

标签: c video opencv avi


【解决方案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(&amp;writer);cvReleaseCapture(&amp;input); 永远不会被调用。试试for(int i=0; i&lt;200; i++) 之类的方法,看看你是否最终得到了一个有效的视频。

            视频通常会在最终写入磁盘之前写入临时文件。如果您的文件未最终确定,则将看不到任何内容。

            希望对您有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-11
              • 1970-01-01
              • 1970-01-01
              • 2016-08-07
              • 2016-02-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多