使用OpenCV从.avi视频获取帧
问题描述:
#include "cv.h"
#include "highgui.h"
int main(int argc, char** argv)
{
CvCapture* capture=0;
IplImage* frame=0;
capture = cvCaptureFromAVI("C:\\boy walking back.avi"); // read AVI video
if(!capture)
throw "Error when reading steam_avi";
cvNamedWindow("w", 1);
for(; ;)
{
/* int cvGrabFrame (CvCapture* capture);
IplImage* cvRetrieveFrame (CvCapture* capture)*/
frame = cvQueryFrame(capture);
if(!frame)
break;
cvShowImage("w", frame);
}
cvWaitKey(0); // key press to close window
cvDestroyWindow("w");
cvReleaseImage(&frame);
}
我在VS2008中使用openCV。我已经读入视频文件,并使用CV_CAP_PROP_FRAME_COUNT获取4秒长视频剪辑的帧数大约为130。我正在做一个步行的动作识别,所以我需要在5帧之间得到其他5帧,所以身体的运动几乎没有变化。我目前有一个节目,可以让我获得一段视频剪辑。但是,我无法获得不同的框架,而且我不知道如何去获得其他5帧。以上是用于获取视频的一帧的代码。使用OpenCV从.avi视频获取帧
答
你应该可以跳过4帧,然后保持第5帧。下面是一个小例子,我写证明这一点:
IplImage* skipNFrames(CvCapture* capture, int n)
{
for(int i = 0; i < n; ++i)
{
if(cvQueryFrame(capture) == NULL)
{
return NULL;
}
}
return cvQueryFrame(capture);
}
int main(int argc, char* argv[])
{
CvCapture* capture = cvCaptureFromFile("../opencv-root/samples/c/tree.avi");
IplImage* frame = NULL;
do
{
frame = skipNFrames(capture, 4);
cvNamedWindow("frame", CV_WINDOW_AUTOSIZE);
cvShowImage("frame", frame);
cvWaitKey(100);
} while(frame != NULL);
cvReleaseCapture(&capture);
cvDestroyWindow("frame");
cvReleaseImage(&frame);
return 0;
}
希望帮助:)
感谢您的帮助。如果我看起来很傻,请原谅我,但我对OpenCV相当陌生。当你的代码运行时,视频剪辑以更快的速度运行,当然,这可以通过调整延迟时间从100等来改变。然而,是否有一种方法可以简单地获取视频中的1/5帧?例如,代码的输出将是一个框架,显示处于中间移动状态的人员。但是迄今为止,非常感谢你的帮助。 – 2012-02-12 06:46:00
那么,你问你是否可以寻找框架X,其中X可以是从1到5的任何框架? – mevatron 2012-02-20 21:02:21
我能够提取非常1帧5帧。感谢您的帮助:)我现在正尝试在视频中创建遮罩图像或复制帧的图像。我想上传这两张图片,告诉你我正在努力完成什么,但是我还没有10个声望:/你还能够告诉我哪些openCV函数可以使用? – 2012-02-21 00:10:22