openCV:如何将视频分割成图像序列?

时间:2010-12-03 23:02:48

标签: c++ c video opencv video-capture

使用opencv,如何将视频分割成图像序列? 我如何拆分它以使输出成为一系列图像?

2 个答案:

答案 0 :(得分:11)

令我惊讶的是,我在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;
}

答案 1 :(得分:9)

即使在我编辑之后,问题看起来更像是“发送我的代码”需求,而不是典型的StackOverflow 问题,OP提供了详细的信息和表明他或她已经对它进行了一些真实的思考。

所以我只是给出一个“半答案”......无论如何,我只是熟悉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)

正如暗示上面需要很多语法和逻辑工作(例如,确定何时停止,生成各个帧的文件名,当然正确地声明变量并使用正确的间接级别w /所有指针;-)。当然,如果使用Python界面,其中一些变得更容易。

Reading and Writing Images and Video OpenCV documentation page,提供有关各个方法的更详细信息。