使用 OpenCV 从 .avi 视频获取帧

2024-01-03

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

我正在使用 openCV 和 VS2008。我读入了一个视频文件并使用 CV_CAP_PROP_FRAME_COUNT 来获取 4 秒长的视频剪辑的帧数,该帧数约为 130。我正在进行步行的运动识别,因此我需要每隔 5 帧获取一次,因为在 5 帧之间,身体的运动几乎没有变化。到目前为止,我有一个程序可以让我获取视频剪辑的一帧。但是,我无法获取不同的帧,而且我不知道如何每隔 5 帧获取一次。上面是用于获取视频一帧的代码。


您应该能够跳过 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;
}

希望有帮助:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OpenCV 从 .avi 视频获取帧 的相关文章

随机推荐