Написание файлов 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);

}

Если Эрик дал правильный ответ, не могли бы вы принять его ответ как правильный на вопрос?

Mihai Limbășan 30.03.2009 19:01

На какой платформе вы работаете? Мне не удалось заставить MJPG работать в Windows.

teeks99 25.05.2009 20:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
2
43 086
7

Ответы 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" );

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

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

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

Когда я гуглил эту проблему, я встречал ответ: «OpenCV в mac os x не поддерживает запись в формате avi, пока он не будет скомпилирован с помощью ffmpeg».

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

You need to provide the full path to the file with the movie in cvCreateVideoWriter. I don't know whether it's only an Mac OS X port issue, but might be, since QTNewDataReferenceFromFullPathCFString from the QT backend is used.

Поддерживает ли он запись в окнах?

Prakhar Mohan Srivastava 07.03.2014 10:13

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

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

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

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

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

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

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

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

Другие вопросы по теме