Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97319
  • 博文数量: 5
  • 博客积分: 169
  • 博客等级: 入伍新兵
  • 技术积分: 106
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-05 16:44
文章分类
文章存档

2012年(5)

我的朋友

分类: C/C++

2012-02-06 12:00:04

用OpenCV播放视频与显示图片的区别,在于播放视频其实就是循环地读取视频中的每一帧,也就是每一张图片,然后快速地顺序显示出来。当需要停止播放视频时,只需要跳出循环即可。而HIghGUI工具包里面的滚动条可以使我们从视频的一帧跳到另外一帧,实现视频播放时的快速拖动功能。
 
环境:WIN7 32bits+VS2010+OpenCV2.2.0
 
在VS2010中新建WIN32项目,完成库及依赖项的配置(具体方法见前一篇)。代码中首先设置全局变量,然后定义一个名为onTrackbarSlide的回调函数,在main函数中调用。具体代码分析如下:
  1. #include "stdafx.h"
  2. #include "cv.h"
  3. #include <cxcore.h>
  4. #include <highgui.h>

  5. //设置全局变量,一个为滚动条的位置。回调函数需要用到的变量cvCapture也是全局变量,所以前面有g_,代表global
  6. int g_slider_position = 0;
  7. CvCapture* g_capture = NULL;

  8. //回调函数,滚动条拖动时被调用 参数是滚动条的位置(整数) 此函数可以设置cvCapture对象的属性
  9. void onTrackbarSlide(int pos){
  10.     cvSetCaptureProperty(
  11.         g_capture,
  12.         CV_CAP_PROP_POS_FRAMES,
  13.         pos
  14.         );
  15. }
  16. //main函数
  17. int _tmain(int argc, _TCHAR* argv[]){
  18.     cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);
  19. //只分配一帧的存储空间,此时指针指向avi的开头空间。
  20.     g_capture=cvCreateFileCapture("myvideo.avi");
  21. //获取视频的全部帧数frames
  22.     int frames =(int)cvGetCaptureProperty(
  23.         g_capture,
  24.         CV_CAP_PROP_FRAME_COUNT
  25.         );
  26. //创建滚动条
  27.     if(frames!=0){
  28.         cvCreateTrackbar(
  29.             "Position",//滚动条名称
  30.             "Video",//所属窗口
  31.             &g_slider_position,
  32.             frames,
  33.             onTrackbarSlide//当滚动条拖动时被触发
  34.             );
  35.     }
  36.     IplImage* frame;
  37. //进入while循环就开始读取avi文件
  38.     while(1){
  39. //将下一帧视频文件载入内存,返回一个对应当前帧的指针,不同与cvLoadImage为图像分配内存,cvQueryFrame使用已经在cvCapture结构中分配好的内存
      frame=cvQueryFrame(g_capture);
      if(!frame)break;
      cvShowImage("Video",frame);
      char c=cvWaitKey(33);//显示每一帧之间有33毫秒的间隔
      if(c==27)break;如果在这间隔期间用户触发Esc按键 循环就退出 否则继续执行循环
     }
  40.     cvReleaseCapture(&g_capture);
  41.     cvDestroyWindow("Video");
  42.     return 0;
  43. }

运行结果:

阅读(8829) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

fiona07172013-09-25 11:11:43

懂这个的高手帮帮忙吧,解惑啊

fiona07172013-09-25 11:02:26

你好,请问,这个功能如果是想在一个菜单栏下实现播放视频,并且在视频播放界面有逐帧播放的滑动条,该如何实现呢?谢谢