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

Posted

技术标签:

【中文标题】使用 OpenCV 从 .avi 视频中获取帧【英文标题】:Getting frames from .avi video using OpenCV 【发布时间】:2012-03-04 00:44:44 【问题描述】:
#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 帧获得一次。以上是获取一帧视频的代码。

【问题讨论】:

【参考方案1】:

您应该能够跳过 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 帧?例如,代码的输出将是一个显示正在移动的人的框架。但是非常感谢您迄今为止的帮助。 那么,您是在问是否可以寻找帧 X,其中 X 可以是从 1 到 5 的任何帧? 我能够提取 5 帧中的 1 帧。感谢您的帮助:) 我现在正在尝试在视频中创建蒙版图像或复制的帧图像。我想上传 2 张图片来向您展示我想要完成的工作,但我还没有 10 名声望:/ 您还能建议我使用哪些 openCV 功能吗? 我赞成你的问题,所以现在你有 10 分 :) 我一定会尽力帮助你。但是,既然回答了这个问题,就问一个新的,每个人都会得到更多的分数:) 非常感谢。当我收到通知说我需要超过 10 个声望来发布图像时,我刚刚尝试发布我的新问题。所以我仍然发布了这个问题,但我不知道你们现在怎么能看到这些图像。不过,你能去看看曲吗?

以上是关于使用 OpenCV 从 .avi 视频中获取帧的主要内容,如果未能解决你的问题,请参考以下文章

opencv 提取avi视频中的帧,逐帧播放

使用opencv检索视频帧 - 未处理的异常

Qt OpenCV从捕获帧写入视频,不保存

如何用opencv读取avi视频并在界面截图进行人脸检测

使用 OpenCV 仅在视频文件开头几秒钟提取帧

从 AVI 捕获 OpenCV 帧