platform: opencv 3.4.2 &vs 2017
#include "cv.h"
#include "highgui.h"
int g_slider_position = 0;
CvCapture * g_capture = NULL;
//再拖动滚动条的时候,滚动条的位置会被作为int数字传入g_capture。
void onTrackbarSlide(int pos) {
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos
);
}
int main() {
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);//申请可以自动调节大小的窗口Example1
g_capture = cvCreateFileCapture("..//..//kris.avi");//读取avi格式的影片
//获取视频总帧数。
int frames = (int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
/*注意cvCreateTrackbar函数的参数:
"Position"是进度条的名称;
"Example3"窗口的名称;
"&g_slider_position" 一个指向int的地址,初始化进度条用的;
"frames"总帧数;
"onTrackbarSlider"函数,拖动进度条的反馈
*/
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("Example2");
return 0;
}
改进版:创建两个滑动条,第一个是步长为10的进度条。第二个的功能控制视频的播放与停止。
注册函数:
int g_slider_position=0;
CvCapture * g_capture=NULL;
int i = 0;
bool going = true;
void onTrackbarSlide(int pos) {
if (pos % 10 != 0)
pos = pos - pos % 10;
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos
);
i = pos;
}
int position=0;
void switch_on (int position) {
if (position == 0)
going = true;
else
going = false;
}
void opencv_4_3::opencv_4_4() {
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);//申请可以自动调节大小的窗口Example1
g_capture = cvCreateFileCapture("..//..//kris.avi");//读取avi格式的影片
//获取视频总帧数。
int frames = (int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
/*注意cvCreateTrackbar函数的参数:
"Position"是进度条的名称;
"Example3"窗口的名称;
"&g_slider_position" 一个指向int的地址,初始化进度条用的;
"frames"总帧数;
"onTrackbarSlider"函数,拖动进度条的反馈
*/
if (frames != 0) {
cvCreateTrackbar( //进度条
"Position",
"Example3",
&g_slider_position,
frames,
onTrackbarSlide
);
cvCreateTrackbar(
"Stop",
"Example3",
&position,
1,
switch_on
);
}
cvSetTrackbarPos("Position", "Example", 1);
cvSetTrackbarPos("Stop", "Example", 0);
IplImage * frame;
while ((frame = cvQueryFrame(g_capture))!=NULL) {
cvSetTrackbarPos("Position", "Example", i);
cvShowImage("Example3", frame);
char c = cvWaitKey(50);
if (c == 27)break;
if (going) {
i += 10;
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, i);
}
else
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, i);
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example2");
}