openCV: Как разбить видео на последовательность изображений? - PullRequest
8 голосов
/ 04 декабря 2010

Используя opencv, как можно разделить видео на последовательность изображений?
Как я могу разделить его так, чтобы на выходе была последовательность изображений?

Ответы [ 2 ]

11 голосов
/ 04 декабря 2010

К моему удивлению, я не смог найти ответ на этот вопрос в StackoverFlow.

В настоящее время я использую OpenCV 2.1 .Это может быть немного старым, но это работает как шарм.Программа прочитает входной файл и создаст последовательность изображений в текущей папке с именем * frame_xx.jpg *

#include <stdio.h>
#include <stdlib.h>
#include "cv.h"
#include "highgui.h"

int main( int argc, char** argv )
{  
    if (argc < 2)
    {
        printf("!!! Usage: ./program <filename>\n");
        return -1;
    }

    printf("* Filename: %s\n", argv[1]);   

    CvCapture *capture = cvCaptureFromAVI(argv[1]);
    if(!capture) 
    {
        printf("!!! cvCaptureFromAVI failed (file not found?)\n");
        return -1; 
    }

    int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    printf("* FPS: %d\n", fps);

    IplImage* frame = NULL;
    int frame_number = 0;
    char key = 0;   

    while (key != 'q') 
    {
        // get frame 
        frame = cvQueryFrame(capture);       
        if (!frame) 
        {
            printf("!!! cvQueryFrame failed: no frame\n");
            break;
        }       

        char filename[100];
        strcpy(filename, "frame_");

        char frame_id[30];
        itoa(frame_number, frame_id, 10);
        strcat(filename, frame_id);
        strcat(filename, ".jpg");

        printf("* Saving: %s\n", filename);

        if (!cvSaveImage(filename, frame))
        {
            printf("!!! cvSaveImage failed\n");
            break;
        }

        frame_number++;

        // quit when user press 'q'
        key = cvWaitKey(1000 / fps);
    }

    // free resources
    cvReleaseCapture(&capture);

    return 0;
}
9 голосов
/ 04 декабря 2010

Даже после моих правок вопрос больше напоминает «отправить мне код» спрос , чем типичный вопрос StackOverflow , в котором ОП предоставляет подробную информацию и демонстрирует, что он или она задумался об этом.

Так что я просто дам «половинный ответ» ... В любом случае, я лишь в меру знаком с модулем машинного обучения OpenCV и едва знаком с остальной частью библиотеки. ; -)

В двух словах, псевдокод должен выглядеть так, и для реализации обычно требуются упомянутые методы OpenCV.

   myCapt = cvCreateFileCapture("myInput.avi")   // Assuming the feed is from a file.

   while (there are frames and we still want them)
      cvGrabFrame(myCapt)
      myImg = cvRetrieveFrame(myCapt)
      // alternatively to cvGrabFrame + cvRetrieveFrame, could use cvQueryFrame()

      // save the file (or do something with it...)
      cvSaveImage("some_file_name_with_seq_nr", myImage)

   cvReleaseCapture(capture)

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

Чтение и запись изображений и видео Страница документации OpenCV , предоставляет более подробную информацию об отдельных методах.

...