《学习OpenCV》第24页,例2-3课后练习:实现滚动条随着视频播放自动移动。
#include "cv.h"
#include "highgui.h"
/*全局变量*/
int g_slider_position = 0; //滑动条当前位置
CvCapture* g_capture = NULL;//视频的帧图像
//*****************************************************
//滑动条回调函数:显示视频的进度
//pos :滑动条当前位置
//*****************************************************
void onTrackbarSlide( int pos )
{
cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, pos );
}
int main()
{
cvNamedWindow( "task_2-3", CV_WINDOW_AUTOSIZE );
g_capture = cvCreateFileCapture( "task_2-3.mp4" );
int frames = (int)cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_COUNT );
/*获得总帧数,也就是滚动条位置的最大值,这个函数的功能和第二个参数有关*/
/*如果此处滚动条没有被拖动,此语句的作用就是在窗口上创建了一个滚动条,其位置为0,即在初始位置*/
if (g_capture!=0)
{
/*当滚动条被拖动时,opencv会自动将当前位置所代表的值传个指针所指向的整数,也就是说当滚动条被拖动时,g_slider_position的值是在改变*/
cvCreateTrackbar( "Position", "task_2-3", &g_slider_position, frames, onTrackbarSlide );
}
IplImage* frame;
while (1)
{
/*从视频中提取帧图像*/
frame = cvQueryFrame( g_capture );
if (!frame)
break;
cvShowImage( "task_2-3", frame );
/*每次循环都在当前位置重新创造一个滚动条,也就是滚动条随着视频播放自动移动(实现了书本的思考练习)*/
cvCreateTrackbar( "Position", "task_2-3", &g_slider_position, frames, onTrackbarSlide );
g_slider_position++;
/*按ESC键退出*/
char c = cvWaitKey(33);
if (c==27)
break;
}
/*释放内存,销毁窗口*/
cvReleaseCapture( &g_capture );
cvDestroyWindow( "task_2-3" );
return(0);
}