用OpenCV播放视频与显示图片的区别,在于播放视频其实就是循环地读取视频中的每一帧,也就是每一张图片,然后快速地顺序显示出来。当需要停止播放视频时,只需要跳出循环即可。而HIghGUI工具包里面的滚动条可以使我们从视频的一帧跳到另外一帧,实现视频播放时的快速拖动功能。
环境:WIN7 32bits+VS2010+OpenCV2.2.0
在VS2010中新建WIN32项目,完成库及依赖项的配置(具体方法见前一篇)。代码中首先设置全局变量,然后定义一个名为onTrackbarSlide的回调函数,在main函数中调用。具体代码分析如下:
- #include "stdafx.h"
- #include "cv.h"
- #include <cxcore.h>
- #include <highgui.h>
- //设置全局变量,一个为滚动条的位置。回调函数需要用到的变量cvCapture也是全局变量,所以前面有g_,代表global
- int g_slider_position = 0;
- CvCapture* g_capture = NULL;
- //回调函数,滚动条拖动时被调用 参数是滚动条的位置(整数) 此函数可以设置cvCapture对象的属性
- void onTrackbarSlide(int pos){
- cvSetCaptureProperty(
- g_capture,
- CV_CAP_PROP_POS_FRAMES,
- pos
- );
- }
- //main函数
- int _tmain(int argc, _TCHAR* argv[]){
- cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);
- //只分配一帧的存储空间,此时指针指向avi的开头空间。
- g_capture=cvCreateFileCapture("myvideo.avi");
- //获取视频的全部帧数frames
- int frames =(int)cvGetCaptureProperty(
- g_capture,
- CV_CAP_PROP_FRAME_COUNT
- );
- //创建滚动条
- if(frames!=0){
- cvCreateTrackbar(
- "Position",//滚动条名称
- "Video",//所属窗口
- &g_slider_position,
- frames,
- onTrackbarSlide//当滚动条拖动时被触发
- );
- }
- IplImage* frame;
- //进入while循环就开始读取avi文件
- while(1){
- //将下一帧视频文件载入内存,返回一个对应当前帧的指针,不同与cvLoadImage为图像分配内存,cvQueryFrame使用已经在cvCapture结构中分配好的内存
frame=cvQueryFrame(g_capture);
if(!frame)break;
cvShowImage("Video",frame);
char c=cvWaitKey(33);//显示每一帧之间有33毫秒的间隔
if(c==27)break;如果在这间隔期间用户触发Esc按键 循环就退出 否则继续执行循环
}
- cvReleaseCapture(&g_capture);
- cvDestroyWindow("Video");
- return 0;
- }
运行结果:
阅读(8829) | 评论(2) | 转发(0) |