鉴于被某段视频给坑了不少时间,所以,我还是口诛笔伐一下。
此视频中,将滚动条移动的代码放到了while循环外,导致我一直无法实现边播放边移动的效果,经过不断地调试之后,总算将其放置到正确的位置,最终达到了我想要的效果。
#include <opencv2/opencv.hpp>
using namespace cv;
int g_slider_position = 0; //表示滚动条当前的初始位置
CvCapture* g_capture = NULL;
int frame_count = 0; //记录滚动条当前的位置
//当滚动条被拖动时,g_slider_position的值被设置为滚动条拖动后的位置 ,
//且g_slider_position作为参数传入onTrackbarSlide函数
void onTrackbarSlider(int pos) {
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos
);
frame_count = pos;
}
int main()
{
cvNamedWindow("video", CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture("lena.flv");
int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
if(frames != 0) {
cvCreateTrackbar(
"Position",
"video",
&g_slider_position,
frames,
onTrackbarSlider //表示滚动条的回调函数(被拖动时调用)
);
}
IplImage* frame;
while(1) {
frame = cvQueryFrame(g_capture);
if(!frame) break;
cvShowImage("video", frame);
cvSetTrackbarPos("Position", "video", frame_count++); //更新滚动条的位置
char c = cvWaitKey(33);
if(c == 27) break; //按ESC退出,ESC对应的ASCII码值为27
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("video");
return 0;
}