使用opencv,如何将视频分割成图像序列? 我如何拆分它以使输出成为一系列图像?
答案 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,提供有关各个方法的更详细信息。