2012-02-12 146 views
5
#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视频获取帧

回答

6

你应该可以跳过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; 
} 

希望帮助:)

+0

感谢您的帮助。如果我看起来很傻,请原谅我,但我对OpenCV相当陌生。当你的代码运行时,视频剪辑以更快的速度运行,当然,这可以通过调整延迟时间从100等来改变。然而,是否有一种方法可以简单地获取视频中的1/5帧?例如,代码的输出将是一个框架,显示处于中间移动状态的人员。但是迄今为止,非常感谢你的帮助。 – 2012-02-12 06:46:00

+1

那么,你问你是否可以寻找框架X,其中X可以是从1到5的任何框架? – mevatron 2012-02-20 21:02:21

+0

我能够提取非常1帧5帧。感谢您的帮助:)我现在正尝试在视频中创建遮罩图像或复制帧的图像。我想上传这两张图片,告诉你我正在努力完成什么,但是我还没有10个声望:/你还能够告诉我哪些openCV函数可以使用? – 2012-02-21 00:10:22