【发布时间】:2011-05-20 00:56:08
【问题描述】:
使用opencv,如何将视频分割成图像序列?
如何拆分它以便输出是一系列图像?
【问题讨论】:
标签: c++ c video opencv video-capture
使用opencv,如何将视频分割成图像序列?
如何拆分它以便输出是一系列图像?
【问题讨论】:
标签: c++ c video opencv video-capture
令我惊讶的是,我在 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;
}
【讨论】:
即使经过我的编辑,这个问题看起来更像是“发送我的代码”需求,而不是典型的 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,提供有关各个方法的更详细信息。
【讨论】: