视频播放控制
通过加入一个滚动条在视频播放时进行快速拖动
HighGUI工具包不仅提供了一些简单的显示函数,还包括一些图像和视频控制方法。其中一个就是滚动条,可以方便地从视频的一帧调到另外一帧。可以通过cvCreateTrackbar()来创建一个滚动条,并且通过设置参数确定滚动条所属窗口。下面是添加滚动条到基本浏览窗口的程序,拖动滚动条,函数onTrackSlide()便被调用并被传入滚动条新的状态值:
#include "highgui.h"
#include "cv.h"
int g_slider_position = 0;
CvCapture *g_capture = NULL;
int Pos = 0;
void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(
g_capture,
//以帧数来设置读入位置
CV_CAP_PROP_POS_FRAMES,
pos
);
Pos = pos;
}
int main(int argc, char **argv)
{
//窗口比例受图像大小限制
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture(argv[1]);
//获取视频最大帧数
int frames = (int)cvGetCaptureProperty(
g_capture,
cv_CAP_PROP_FRAME_COUNT
);
if(frame != 0)
{
cvCreateTrackbar(
//被创建的Trackbar名字
"Position",
//窗口名字
"Example3",
//整数指针,该值反应滑块位置,并指明创建时的滑块位置
&g_slider_position,
//滑块位置的最大值,最小值为0
frames,
//回调函数,每次滑块位置改变时,被调用函数的指针,这个函数应被声明为void Foo(int); 如果没有回调函数,这个值设为NULL
onTrackbarSlide
);
}
IplImage *frame;
while(1)
{
frame = cvQueryFrame(capture);
if(!frame)break;
cvShowImage("Example3",frame);
char c = cvWaitKey(33);
if(c == 27)break;
cvSetTrackbarPos(
"Position",
"Example3",
pos++
);
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example3");
return 0;
}
函数解释说明:
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:视频文件中帧的总数
int cvCreateTrackbar(
const char* trackbar_name,
const char* window_name,
int* value,
int count,
CvTrackbarCallback on_change
);
-参数1:被创建的Trackbar名字
-参数2:窗口名字
-参数3:整数指针,该值反应滑块位置,并制定创建时的滑块位置。当拖动滑块时,函数就会根据滑块位置改变该值。
-参数4:程序中视频最大帧数
-参数5:回调函数
int cvSetCaptureProperty(
CvCapture* capture,
int property_id,
double value
);
该函数与cvGetCaptureProperty()是对应的,不同之处为value这个参数,这个是设置属性的值。如上述例子中,pos表示设置视频播放到固定帧数,该值就是设定的帧数。
void cvSetTrackbarPos(
const char* window_name,
int pos
);
设置滑块位置