您的位置:首页 > 运维架构

opencv学习笔记(四)-视频播放控制

2015-09-04 13:01 537 查看
下面是一个播放AVI是视频带控制条的程序:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#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;是为了保证我们拖懂滑块的时候保证滑块然这两个数保持一致。如果没有这句,你会发现当你拖动滑块的时候,放开滑块后又回归原位。无法让视频播放到你拖动到的位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 开源代码