Запись файлов 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);

}
15.12.2008 16:42:33
Если Эрик дал правильный ответ, не могли бы вы принять его ответ как правильный ответ на вопрос?
Mihai Limbășan 30.03.2009 15:01:06
На какой платформе вы работаете? У меня были проблемы с получением MJPG для работы на Windows.
teeks99 25.05.2009 16:46:15
7 ОТВЕТОВ

Возможно, вы можете попробовать вставить 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" );

Затем посмотрите, есть ли у вас какие-либо окна, и содержат ли они правильное содержимое.

0
29.12.2008 13:18:18

Держу пари, что cvCreateVideoWriter возвращает NULL. Просто пройдитесь по нему, чтобы увидеть, правда ли это. В этом случае проблема, вероятно, связана с CV_FOURCC (..), который не находит кодек и не возвращает 0;

Вы можете попробовать использовать -1 вместо CV_FOURCC. Во время выполнения будет предложено выбрать подходящий кодек

13
8.01.2009 16:12:46

Когда я решаю эту проблему в Google, я отвечаю: «OpenCV на Mac OS X не поддерживает запись AVI, пока она не будет скомпилирована с помощью ffmpeg».

Для меня, кажется, работает это решение http://article.gmane.org/gmane.comp.lib.opencv/16005

Вам нужно указать полный путь к файлу с фильмом в cvCreateVideoWriter. Я не знаю, является ли это только проблемой порта Mac OS X, но может быть, так как используется QTNewDataReferenceFromFullPathCFString из бэкэнда QT.

3
30.03.2009 15:35:09
Поддерживает ли запись в Windows?
Prakhar Mohan Srivastava 7.03.2014 06:13:26

эй, этот код работает в 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;
  }

Я скомпилировал и запустил, работает отлично. (Я не видел выше, получил ли ты свой ответ или нет .., но для этой конкретной вещи я очень усердно работал раньше, и вдруг я просто сделал это, из некоторых фрагментов кода.)

1
23.05.2009 14:51:21

Этот код работал нормально:

 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;
}
0
18.10.2011 15:30:13

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что ваш цикл for никогда не заканчивается; поэтому cvReleaseVideoWriter(&writer);и cvReleaseCapture(&input);никогда не позвонят. Попробуйте что-нибудь подобное for(int i=0; i<200; i++)и посмотрите, не закончится ли у вас рабочим видео.

Часто видео записывается во временные файлы перед финализацией на диске. Если ваш файл не завершен, ничего не будет видно.

Надеюсь, это поможет.

0
13.11.2011 00:14:53

Это проблема кодека. Попробуйте все возможные кодеки (опция -1в cvCreateVideo). В моем случае Microsoft Video 1работал хорошо.

1
30.06.2012 09:02:55