使用OPENCV播放AVI视频

本次讲解如何使用OPENCV播放AVI视频,不过在写程序之前得告诉大家一声,OPENCV只支持AVI格式的视频播放。

首先,源代码基本格式:

#include<highgui.h>
int main(int argc,char** argv)
{
 cvNamedWindow("Michael",CV_WINDOW_AUTOSIZE);
 CvCapture* capture=cvCreateFileCapture(argv[1]);
 IplImage* frame;
 while(1)
 {
  frame=cvQueryFrame(capture);
  if(!frame) break;
  cvShowImage("Example2",frame);
  char c=cvWaitKey(30);
  if(c==27) break;
 }
 cvReleaseCapture(&capture);
 cvDestroyWindow("Example2");
}

下面在一一解释代码意思:

本次代码中有些函数与上篇中的一样(意思与功能),所以不再废话。

CvCapture* capture=cvCreateFileCapture(argv[1]);

函数cvCreateFileCapture()通过参数设置确定要读入的AVI文件,返回一个指向CvCapture结构的指针,这个结构包含要读入的AVI文件的所有信息,其中包含状态信息。

  frame=cvQueryFrame(capture);

一旦进入while(1)循环,我们便开始读入AVI文件, cvQueryFrame()的参数为Capture结构的指针,用来将下一帧视频文件载入内存。返回一个对应当前帧的指针,与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame()使用已经在cvCapture结构中分配好的内存,所以,当结构CvCapture被释放后,每一帧图像所对应的内存空间即会被释放。

 char c=cvWaitKey(30);
  if(c==27) break;

当前帧被显示后,我们会等待33毫秒,接着播放下一帧。如果其间用户触发了一个按键,c就会被相应置成这个按键的ASCII码,ESC的ASCII码为27,所以ESC即表示退出当前视频播放。

cvReleaseCapture(&capture);
cvDestroyWindow("Example2");

退出视频播放,释放相应的指针和窗口。

小试牛刀:

#include<highgui.h>
int main(int argc,char** argv)
{
 cvNamedWindow("Michael");
 CvCapture* capture=cvCreateFileCapture("F:\sample.avi");
 IplImage* frame;
 while(1)
 {
  frame=cvQueryFrame(capture);
  if(!frame) break;
  cvShowImage("Michael",frame);
  char c=cvWaitKey(30);
  if(c==27) break;
 }
 cvReleaseCapture(&capture);
 cvDestroyWindow("Michael");
}

此次,我播放的是我收集的一部电影《了不起的盖茨比》的部分剪辑,就是电影的那段放歌曲《young and beautiful》的片段。

程序写完后,可能必不能立即播放视频,首先要检查程序是否出错,一般只要出现视频一闪的情况程序可能就没问题,那么该如何才能正常播放视频了,我的只出现程序正确但老是一闪的情况,对于这种情况,网上有一些解法,我在这里推荐一种方法:

http://blog.csdn.net/makenothing/article/details/8128455,这是我在Google上搜到的,可以参考一下。

原文地址:https://www.cnblogs.com/MichaelLi1994/p/3521439.html