这个程序我们通过通过加入滚动条来控制视频的播放。
代码如下:#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int g_slider_position = 0;
int n = 0; //定义一个全局变量,控制滚动条的位置
CvCapture *g_capture = NULL;
/* 当滚动条被拖动时,g_slider_position的值被设置为滚动条拖动后的位置 ,
且g_slider_position作为参数传入onTrackbarSlide函数
*/
void onTrackbarSlide( int pos )
{
cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, pos );
// 输出的值是一样的
n = pos;
return;
}
int main()
{
cvNamedWindow( "Example3", CV_WINDOW_AUTOSIZE );
// CvCapture *capture = cvCreateFileCapture("E:\\FilesOutput\\test.avi");
// 该avi文件必须为x-vid格式,要么电脑上要装解码器
g_capture = cvCreateFileCapture("1.wmv");
int frames = (int)cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_COUNT );
if( frames != 0 )
{
// "position"表示滚动条的名词,"Example3"表示滚动条所属窗口, g_slider_position表示滚动条当前位置
// frames表示滚动条的最大值,onTrackbarSlide表示滚动条的回调函数(被拖动时调用)
cvCreateTrackbar( "position", "Example3", &g_slider_position, frames, onTrackbarSlide );
}
IplImage *frame = NULL;
while(1)
{
frame = cvQueryFrame(g_capture);
if(!frame)
{
break;
}
cvShowImage( "Example3", frame );
cvSetTrackbarPos( "position", "Example3", n++ );
char c = cvWaitKey(33);
if( c == 27 ) // 按下esc 退出
{
break;
}
cout << g_slider_position << endl;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example3");
return 0;
}
3.1程序理解
从本质上说,这种方法是通过添加一个全局变量来表示滚动条位置并且添加一个回调函数更新变量以及重新设置视频读入位置。
首先为滚动条位置定义一个全局变量。由于回调函数需要使用CvCapture对象,因此我们将它定义为全局变量,为了是我们的程序可读性更强,我们在全局变量名称前面加上g_。
int g_slider_position = 0;
CvCapture *g_capture = NULL;
那么我们这里所说的回调函数是哪一个呢?应当是:
void onTrackbarSlide( int pos )
因为在主程序里, 函数
cvCreateTrackbar( "position", "Example3", &g_slider_position, frames, onTrackbarSlide );
} 的一个参量就是函数onTrackbarSlide,可见它是被调用的,所以是回调函数。
从主函数main开始看:
1、创建一个窗口——显示用;
2、通过cvCreateFileCapture(要播放的视频名)确定要播放的视频;
3、通过cvGetCaptureProperty()获取视频的总帧数
4、如果总帧数!=0——创建进度条;
返回的帧数为0时,进度条不会被创建。这是因为对于某些编码方式,总的帧数获取不到,在这种情况下,我们只能直接播放视频文件而看不到进度条。
5、cvCreateTrackbar()用来创建进度条。一旦滚动条被拖动,回调函数就会被调用,并且滚动条的新位置值就会传入回调函数中。
cvCreateTrackbar( "position", "Example3", &g_slider_position, frames, onTrackbarSlide );
其中的&g_slider_position就代表滚动条的新位置值
——&g_slider_position是一个整数指针(I think就是指向一个整数)作为参数传入回调函数void onTrackbarSlide(in