本次讲解如何使用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上搜到的,可以参考一下。