使用OpenCV从.avi视频中获取帧

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获取帧数,大约为130个,对应4秒的视频片段。我正在进行步态识别的运动分析,因此需要获取每5帧中的另一帧,因为在这5帧之间,身体的运动变化很小。到目前为止,我的程序允许我获取视频剪辑的一个帧。然而,我无法获取不同的帧,也不确定如何获取每5帧中的另一帧。上面的代码是用于获取视频帧的一个示例。
1个回答

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;
}

希望这能帮到您 :)

感谢你的帮助。如果我显得很傻,请原谅,因为我对OpenCV还比较陌生。当你运行你的代码时,视频剪辑运行速度更快,当然,可以通过调整延迟时间从100等来改变。但是,有没有一种方法可以仅获得视频的每5帧中的1帧?例如,代码的输出将是一个显示人在中间运动的帧。但是,非常感谢您迄今为止的帮助。 - sue-ling
1
那么,您是在问是否可以寻求构建X,其中X可以是从1到5的任何框架? - mevatron
我能够提取每5帧中的第1帧。谢谢你的帮助:) 我现在正在尝试创建视频帧的掩码图像或复制图像。我想上传这2个图像以展示我想要实现的目标,但我还没有10个声望:/ 你能否建议我使用哪些openCV函数? - sue-ling
1
我给你的问题点了赞,所以你现在有10分啦 :) 我一定会尽力帮助你。但是,既然这个问题已经得到解答,你可以提出一个新问题,这样每个人都能获得更多的积分 :) - mevatron
非常感谢。我刚刚尝试发布我的新问题时,收到通知说我需要超过10个声望才能发布图片,真是太烦人了。所以我还是发布了问题,但我不知道你们如何看到这些图片。无论如何,你能去找一下这个问题吗? - sue-ling
@mevatron,你有没有用Python和OpenCV实现相同功能的想法? - praxmon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接