#include "cv.h"
#include "highgui.h"
int g_slider_position = 0;
CvCapture* g_capture = NULL;
void onTrackbarSlide(int pos) {
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
}
int main(int argc, char **argv)
{
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
if (argc == 2 && (g_capture = cvCreateFileCapture(argv[1])) != 0)
{
int frames = (int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
if (frames != 0) {
cvCreateTrackbar(
"Position",
"Example3",
&g_slider_position,
frames,
onTrackbarSlide
);
}
IplImage* frame;
while (1) {
frame = cvQueryFrame(g_capture);
if (!frame) break;
cvShowImage("Example3", frame);
char c = cvWaitKey(33);
if (c == 27) break;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example3");
return 0;
}
return -1;
}
运行效果如下:
本代码段通过一个全局变量读取滚动条位置并且当滚动条位置发生变化时通过回调函数调用重新设置视频读入位置。
int g_slider_position = 0;
CvCapture* g_capture = NULL;
g_slider_position是滚动条的位置, g_capture是回调函数的input参数。
void onTrackbarSlide(int pos){
cvSetCaptureProperty(
g_capture,
CV_CAP_POS_PRAMES,
pos);
}
onTracebarSlide是一个回调函数,目的是在每一次进度条有变化的时候通知图像加载到进度条指向的那一帧。cvCreateTrackbar函数的第五个参数实现onTracebarSlide的注册。
本程序中我们设置参数CV_CAP_PROP_POS_PRAMES,本参数表示以帧数来设置读入位置,如果想通过以视频长度比例来设置读入位置,我们可以通过AVI_RATIO代替FRAMES来实现。
cvCreateTrackbar()可设置滚动条的名称并确定滚动条的所属窗口。