opencv学习笔记(四)-视频播放控制
2015-09-04 13:01
537 查看
下面是一个播放AVI是视频带控制条的程序:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
下面介绍一下重要的函数和语句:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvGetCaptureProperty()函数:获取视频结构体的属性。
cvGetCaptureProperty( CvCapture* capture, int property_id );
这个函数有两个参数,第一个是你要获取的结构体,
第二个是id,配置不同的id获得不同的属性。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvCreateTrackbar()函数:创建trackbar并将它添加到指定的窗口。
这个函数带有5个参数这5个参数意义如下:
trackbar_name
被创建的trackbar名字。
window_name
窗口名字,这个窗口将为被创建trackbar的父对象。
value ()
整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。
当我们拖动控制条上的滑块时,函数就会根据滑块位置改变这个数的值
count (程序中是视频最大帧数)
滑块位置的最大值。最小值一直是0。
on_change (回调函数)
每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
有必要提一下这个回调函数onTrackbarSlide(),这个回调函数有固定的形式:必须声明成void Foo(int);
在我们的程序中使用的回调函数是为了让视频播放滑块所在的帧数,
回调函数:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
使用:
当我们拉动控制条的时候,就会执行回调函数,下面是一个关于回调函数的例子:
编译运行后,我们拖动滑块,会打印g_slider_position,pos这两数的值,不拖动则无反应,所以我们可以知道,回调函数只有在拖动滑块(执行cvCreateTrackbar函数时才发生),而且回调函数的额参数是滑块的位置。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvSetCaptureProperty ()函数:设置视频获取属性 ;
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
参数说明:这个函数跟cvGetCaptureProperty()是对应的,capture和id参数都是一样的。不同的在于value这个参数,这个是设置属性的值,
这里的意思一设置视频播放到固定的帧数(pos就是设定的帧数),
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvSetTrackbarPos()函数:设置滑块的位置
参数分析:
trackbar_name
trackbar的名字。
window_name
trackbar父窗口的名字。
pos
新的位置。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame_count:滑块位置。
frame_count++;是为了然滑块随着视频一帧一帧播放而一帧一帧向右移动,
frame_count = pos;是为了保证我们拖懂滑块的时候保证滑块然这两个数保持一致。如果没有这句,你会发现当你拖动滑块的时候,放开滑块后又回归原位。无法让视频播放到你拖动到的位置。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "highgui.h" #include "cv.h" int g_slider_position = 0; CvCapture* g_capture = NULL; int frame_count = 0; void onTrackbarSlide(int pos) { cvSetCaptureProperty ( g_capture, CV_CAP_PROP_POS_FRAMES, //我们以帧数来设置读入位置 pos ); frame_count = pos; } int main() { cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE); //窗口比例受图像大小限制 g_capture = cvCreateFileCapture("F:\\Opencv\\素材\\1.avi"); int frames = (int)cvGetCaptureProperty //获取视频最大帧数 ( g_capture, CV_CAP_PROP_FRAME_COUNT ); if (frames != 0) { cvCreateTrackbar ( "Position", //被创建的trackbar名字 "Example3", //窗口名字,这个窗口将为被创建trackbar的父对象。 &g_slider_position, //整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。 frames, //滑块位置的最大值。最小值一直是0。 onTrackbarSlide //(回调函数)每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。 ); } IplImage* frame; while (1) { frame = cvQueryFrame(g_capture); if (!frame == 1) { break; } cvShowImage("Example3",frame); char c = cvWaitKey(33); if (c == 27) { break; } cvSetTrackbarPos ( "Position", "Example3", frame_count ); frame_count++; } cvReleaseCapture(&g_capture); cvDestroyWindow("Example3"); }
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
下面介绍一下重要的函数和语句:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvGetCaptureProperty()函数:获取视频结构体的属性。
cvGetCaptureProperty( CvCapture* capture, int property_id );
这个函数有两个参数,第一个是你要获取的结构体,
第二个是id,配置不同的id获得不同的属性。
CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳 CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点 CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾) CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度 CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度 CV_CAP_PROP_FPS - 帧率 CV_CAP_PROP_FOURCC - 表示codec的四个字符 CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvCreateTrackbar()函数:创建trackbar并将它添加到指定的窗口。
int cvCreateTrackbar( const char* trackbar_name, const char* window_name,int* value, int count, CvTrackbarCallback on_change );
这个函数带有5个参数这5个参数意义如下:
trackbar_name
被创建的trackbar名字。
window_name
窗口名字,这个窗口将为被创建trackbar的父对象。
value ()
整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。
当我们拖动控制条上的滑块时,函数就会根据滑块位置改变这个数的值
count (程序中是视频最大帧数)
滑块位置的最大值。最小值一直是0。
on_change (回调函数)
每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
有必要提一下这个回调函数onTrackbarSlide(),这个回调函数有固定的形式:必须声明成void Foo(int);
在我们的程序中使用的回调函数是为了让视频播放滑块所在的帧数,
回调函数:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
使用:
当我们拉动控制条的时候,就会执行回调函数,下面是一个关于回调函数的例子:
#include "highgui.h" #include "cv.h" int g_slider_position = 0; CvCapture* g_capture = NULL; int frame_count = 0; void onTrackbarSlide(int pos) { printf("g_slider_position:%d\tpos:%d\n", g_slider_position,pos); } int main() { cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE); //窗口比例受图像大小限制 cvCreateTrackbar ( "Position", "Example3", &g_slider_position, 500, onTrackbarSlide //(回调函数)每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。 ); cvWaitKey(0); }
编译运行后,我们拖动滑块,会打印g_slider_position,pos这两数的值,不拖动则无反应,所以我们可以知道,回调函数只有在拖动滑块(执行cvCreateTrackbar函数时才发生),而且回调函数的额参数是滑块的位置。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvSetCaptureProperty ()函数:设置视频获取属性 ;
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
参数说明:这个函数跟cvGetCaptureProperty()是对应的,capture和id参数都是一样的。不同的在于value这个参数,这个是设置属性的值,
cvSetCaptureProperty ( g_capture, CV_CAP_PROP_POS_FRAMES, //我们以帧数来设置读入位置 pos );
这里的意思一设置视频播放到固定的帧数(pos就是设定的帧数),
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvSetTrackbarPos()函数:设置滑块的位置
参数分析:
void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos );
trackbar_name
trackbar的名字。
window_name
trackbar父窗口的名字。
pos
新的位置。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame_count:滑块位置。
frame_count++;是为了然滑块随着视频一帧一帧播放而一帧一帧向右移动,
frame_count = pos;是为了保证我们拖懂滑块的时候保证滑块然这两个数保持一致。如果没有这句,你会发现当你拖动滑块的时候,放开滑块后又回归原位。无法让视频播放到你拖动到的位置。
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- OpenCV 2.4.3 C++ 平滑处理分析
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- OpenCV学习笔记(二十五)——OpenCV图形界面设计Qt+VS2008
- 分享一些OpenCV实现立体视觉的经验
- 关于OpenCv图像变换与基本图形检测
- "应用程序正常初始化失败"-0xc0150002 解决办法
- 开源代码编译过程及原理
- OpenCV->HSV色彩空间
- opencv 内存泄露
- OpenCV函数cvFindContours
- OpenCV 2.3.1图像文件的读入和显示
- 愿这里真是开源代码的宝藏!
- opencv2 矩阵方式 resize图像缩放代码