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

C++ openCV:如何将视频分割成图像序列?,c++,c,video,opencv,video-capture,C++,C,Video,Opencv,Video Capture,使用opencv,如何将视频分割成图像序列? 如何将其拆分,使输出成为一系列图像?即使在我编辑之后,这个问题看起来更像是一个“向我发送代码”的要求,而不是一个典型的StackOverflow问题,即OP提供了详细信息,并证明他或她对此进行了一些真正的思考 所以我会给出一个“半答案”。。。无论如何,我只对OpenCV的机器学习模块略知一二,对库中的其他部分几乎一无所知 简而言之,伪代码应该是这样的,实现通常需要前面提到的OpenCV方法 myCapt = cvCreateFileCaptur

使用opencv,如何将视频分割成图像序列?

如何将其拆分,使输出成为一系列图像?

即使在我编辑之后,这个问题看起来更像是一个“向我发送代码”的要求,而不是一个典型的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接口,其中一些操作会变得更容易


,提供了有关各个方法的更详细信息。

令我惊讶的是,我找不到有关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;
}
#包括
#包括
#包括“cv.h”
#包括“highgui.h”
int main(int argc,字符**argv)
{  
如果(argc<2)
{
printf(!!!用法:./program\n”);
返回-1;
}
printf(“*文件名:%s\n”,argv[1]);
CvCapture*capture=cvCaptureFromAVI(argv[1]);
如果(!捕获)
{
printf(!!!cvCaptureFromAVI失败(找不到文件?)\n);
返回-1;
}
int fps=(int)cvGetCaptureProperty(捕获,CV_CAP_PROP_fps);
printf(“*FPS:%d\n”,FPS);
IplImage*frame=NULL;
int frame_number=0;
字符键=0;
while(键!=“q”)
{
//获得框架
帧=cvQueryFrame(捕获);
如果(!帧)
{
printf(!!!cvQueryFrame失败:无帧\n”);
打破
}       
字符文件名[100];
strcpy(文件名,“frame_”);
字符帧_id[30];
itoa(帧号,帧id,10);
strcat(文件名、帧id);
strcat(文件名为“.jpg”);
printf(“*保存:%s\n”,文件名);
如果(!cvSaveImage(文件名,帧))
{
printf(!!!cvSaveImage失败\n”);
打破
}
帧号++;
//当用户按“q”时退出
键=cvWaitKey(1000/fps);
}
//免费资源
cvReleaseCapture(&capture);
返回0;
}

@mero0o这是另一个完全不同的问题,取决于您使用的平台。我相信这个问题已经解决了。别忘了接受我的答案。@mero0o可能吧,但我不知道,因为我没有答案。试试看,如果不行,就转到2.1。小心,最新的OpenCV改变了很多,我的代码可能无法编译。此代码特定于2.1。顺便说一句,Google有很多结果显示了如何设置您的环境来编译OpenCV内容。看看这个:如果我下载opencv2.1,并且我有visualstudi 2008,那么这个如何工作呢?这样我就可以编写代码并运行它。你注意到在你的另一个线程上回答同样问题的也是我吗?我不会在这里重复我的答案。@karlphillip你经常使用opencv吗?只是好奇。。。我看到你在opencv上回答了很多问题:)