【问题标题】:openCV: How to split a video into image sequence?openCV:如何将视频分割成图像序列?
【发布时间】:2011-05-20 00:56:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • @mero0o 这是另一个完全不同的问题,取决于您使用的平台。我相信这个问题已经解决了。不要忘记接受我的回答。
    • @mero0o 可能,但我不知道,因为我没有。试试看,如果还是不行,就移到2.1。小心,最新的 OpenCV 发生了很大变化,我的代码可能无法编译。此代码特定于 2.1。顺便说一句,谷歌有很多结果展示了如何设置你的环境来编译 OpenCV 的东西。看看这个:rajputyh.blogspot.com/2010/03/…
    • 如果我下载了 opencv2.1 并且我有 visualstudi 2008 这如何与它一起工作,因此我可以编写这段代码并运行它
    • 您是否注意到在您的另一个线程上回答同样问题的也是我?我不会在这里重复我的答案。
    • @karlphillip 你经常使用opencv吗?只是好奇...我看到你在 opencv 上回答了很多问题 :)
    【解决方案2】:

    即使经过我的编辑,这个问题看起来更像是“发送我的代码”需求,而不是典型的 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)
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 2018-11-23
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      相关资源
      最近更新 更多