显示一张图片,对于我们来说是很容易理解的事情。但播放一个视频,感觉就很神秘很有技术含量了。
然而今天看了《学习OpenCV中文版》中的两个小例子后,惊呼,原来如此,居然这么简单!就是我们经常所说的电影动画原理:视觉残留。先从视频文件中取出一帧(即一张图片),显示出来,暂停若干毫秒后,取下一张,再显示出来,视频就播放起来了。
显示一张图片
使用OpenCV读取并显示一张图片。
核心代码
核心代码就这几行:
#include "highgui.h"
char* imgPath = "logo.png";
IplImage* img = cvLoadImage(imgPath);
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);
cvShowImage("Example1", img);
首先通过cvLoadImage函数读取一张图片,然后创建一个窗口,再把img指针传过去,就显示出来了。
见效果:
完整代码
下面是一个完整的示例,增加销毁图片、窗口等擦PP的操作:
#include "highgui.h"
int main(int argc, char** argv) {
char* imgPath = "logo.png";
IplImage* img = cvLoadImage(imgPath);
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);
cvShowImage("Example1", img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Example1");
return 0;
}
值得一提的是,cvLoadImage函数可识别多数常用的图片格式,像png/bmp/jpg等,遗憾的是不识别gif(可能因为gif是多帧图片)。
播放一个AVI视频
OpenCV可以播放AVI格式的视频,不过在我的电脑上只能播放一些特别简单的,大一点的就会出错,可能是缺少相应的解码器。所以在测试下面的例子时,尽量找一些简单的AVI视频来试。
播放原理
如本文开头所说,就是通过函数从视频文件中取一帧帧的图片,隔一小段时间显示一张。当速度达到每秒24张左右时,就能形成流畅的动态效果。
通过OpenCV提供的函数从视频文件中取帧图片,再结合上例中显示图片的代码,就可轻松搞定。
核心代码
char* avi = "d:\\demo.avi";
CvCapture* capture = cvCreateFileCapture(avi);
IplImage* frame = cvQueryFrame(capture);
通过cvCreteFileCapture处理avi文件,得到一个capture指针,再通过cvQueryFrame就得到了它下一张图片。反复去取,反复播放即可。
效果如下:
完整代码
完整的代码如下:
#include "highgui.h"
int main22(int argc, char** argv) {
char* avi = "d:\\demo.avi";
cvNamedWindow ("Example2", CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCreateFileCapture(avi);
IplImage* frame ;
while(1) {
frame = cvQueryFrame(capture);
if(!frame) break;
cvShowImage("Example2", frame);
char c = cvWaitKey(33);
if(c==27) break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example2");
return 0;
}
可以看出还是非常简单的。
关于对视频的进一步控制,如获取文件实际帧率,跳到某一帧,前进后退等,等以后再写。