11

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);

}
4

7 に答える 7

13

私の賭けは、cvCreateVideoWriter が NULL を返すことです。それが本当かどうかを確認するために、それをステップスルーしてください。その場合、問題はおそらく CV_FOURCC(..) にあり、コーデックが見つからず、強制的に 0 が返されます。

CV_FOURCC の代わりに -1 を使用してみてください。適切なコーデックを選択するように、実行時にプロンプ​​トが表示されます。

于 2009-01-08T16:12:46.590 に答える
1

ねえ、このコードは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;
  }

コンパイルして実行しましたが、正常に動作します。(あなたがあなたの答えを得たかどうかは上でわかりませんでした..しかし、この特定のことのために、私は以前に非常に一生懸命働き、突然、いくつかのコードスニペットからそれをしました。)

于 2009-05-23T14:51:21.483 に答える
1

コーデックの問題です。-1可能なすべてのコーデックを試してください ( のオプションcvCreateVideo)。私の場合、Microsoft Video1はうまく機能しました。

于 2012-02-02T19:12:34.767 に答える
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;
}
于 2009-07-27T07:19:45.523 に答える
0

たぶん、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" );

次に、ウィンドウが表示されるかどうか、およびウィンドウに適切なコンテンツが含まれているかどうかを確認します。

于 2008-12-29T13:18:18.613 に答える
0

あなたが遭遇している問題は、「for」ループが終わらないことだと思います。したがって、呼び出されることはcvReleaseVideoWriter(&writer);ありcvReleaseCapture(&input);ません。次のようなことを試してfor(int i=0; i<200; i++)、動作するビデオになるかどうかを確認してください。

多くの場合、ビデオはディスク上でファイナライズされる前に一時ファイルに書き込まれます。ファイルがファイナライズされていない場合、何も表示されません。

それが役立つことを願っています。

于 2010-06-18T16:06:52.477 に答える