在 OpenCV 中播放视频

Posted

技术标签:

【中文标题】在 OpenCV 中播放视频【英文标题】:Playing a video in OpenCV 【发布时间】:2013-03-11 06:27:17 【问题描述】:

我是 OpenCV 的初学者,我希望。我制作了一个代码,但它只显示一个图像。 我正在使用 OpenCV 2.1 和 Visual Studio 2008。 如果有人指导我哪里出错了,我将不胜感激。 这是我粘贴的代码:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int main()

CvCapture* capture = cvCaptureFromAVI("C:/OpenCV2.1/samples/c/tree.avi");
IplImage* img = 0; 
if(!cvGrabFrame(capture))              // capture a frame 
printf("Could not grab a frame\n\7");
exit(0);
cvQueryFrame(capture); // this call is necessary to get correct 
                   // capture properties
int frameH    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int fps       = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int numFrames = (int) cvGetCaptureProperty(capture,  CV_CAP_PROP_FRAME_COUNT);
///numFrames=total number of frames



printf("Number of rows %d\n",frameH);
printf("Number of columns %d\n",frameW,"\n");
printf("frames per second %d\n",fps,"\n");
printf("Number of frames %d\n",numFrames,"\n");

for(int i=0;i<numFrames;i++)

IplImage* img = 0;
img=cvRetrieveFrame(capture); 
cvNamedWindow( "img" );
cvShowImage("img", img);


cvWaitKey(0);
cvDestroyWindow( "img" );
cvReleaseImage( &img );
cvReleaseCapture(&capture);


return 0;

【问题讨论】:

【参考方案1】:

您必须使用cvQueryFrame 而不是cvRetrieveFrame。同样正如@Chipmunk 所指出的,您必须在cvShowImage 之后添加延迟。

#include "stdafx.h" 
#include "cv.h"       
#include "highgui.h"
cvNamedWindow( "img" );
for(int i=0;i<numFrames;i++)

   IplImage* img = cvQueryFrame(capture); 
   cvShowImage("img", img);
   cvWaitKey(10);

这是使用 OpenCV 播放视频的完整方法:

int main()

    CvCapture* capture = cvCreateFileCapture("C:/OpenCV2.1/samples/c/tree.avi");

    IplImage* frame = NULL;

    if(!capture)
    
        printf("Video Not Opened\n");
        return -1;
    

    int width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
    int height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
    double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    int frame_count = (int)cvGetCaptureProperty(capture,  CV_CAP_PROP_FRAME_COUNT);

    printf("Video Size = %d x %d\n",width,height);
    printf("FPS = %f\nTotal Frames = %d\n",fps,frame_count);

    while(1)
    
        frame = cvQueryFrame(capture);

        if(!frame)
        
            printf("Capture Finished\n");
            break;
        

        cvShowImage("video",frame);
        cvWaitKey(10);
    

    cvReleaseCapture(&capture);
    return 0;

【讨论】:

cvQueryFrame() 和 cvWaitKey() 函数似乎确实解决了这个问题。谢谢:) @AaymanKhalid 你可以考虑accepting the answer。 :) 还有一点,createFileCapture 和 captureFromAVI 有什么区别??? @AaymanKhalid...两者都是一样的。可以在highgui_c.h文件末尾查看。【参考方案2】:

在窗口上显示图像后,必须延迟或等待才能显示下一个图像,我想你可以猜到这是为什么。好的,对于那个延迟,我们使用 cvWaitKey() 。 这就是我在循环代码中添加的内容。

cvNamedWindow( "img" );
for(int i=0;i<numFrames;i++)

   IplImage* img = 0;
   img=cvRetrieveFrame(capture); 

   cvShowImage("img", img);
   cvWaitKey(10); 


【讨论】:

它似乎不起作用:(我理解我正在使用循环因为我知道帧数但循环的目的基本上是按索引访问元素索引。有没有办法按索引抓取帧索引?@chipmunk ` IplImage* 帧 = NULL; cvNamedWindow("img", CV_WINDOW_AUTOSIZE); while (key != 'q') frame = cvQueryFrame(capture); if (!frame) printf("!!! cvQueryFrame 失败:无帧\n");休息; cvShowImage("img", 帧);键 = cvWaitKey(27); ` 我在上面所做的是在循环外创建窗口和我声明的 IPL 图像。这也会提高你的表现。当然,它现在处于一个 while 循环中,您不必获取 frameCount。

以上是关于在 OpenCV 中播放视频的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV + Qt 制作视频播放器

基于python + opencv的视频播放调节功能

opencv库视频播放[关闭]

opencv重复循环播放视频

opencv播放视频屏幕固定位置显示文字

Qt + OpenCV 使用 std::thread 播放视频