在說明如何給視頻中添加進度條之前,先要解釋下回調函數:
這個createTrackbar函數,爲我們創建一個具有特定名稱和範圍的軌跡條(Trackbar,或者說是滑塊範圍控制工具),指定一個和軌跡條位置同步的變量。而且要指定回調函數onChange(第五個參數),在軌跡條位置改變的時候來調用這個回調函數。並且我們知道,創建的軌跡條顯示在指定的winname(第二個參數)所代表的窗口上。
具體程序如下:
#include "highgui.h"#include "iostream"
using namespace std;
using namespace cv;
VideoCapture video1("Seq04.avi");
int position =video1.get(CV_CAP_PROP_POS_FRAMES); //如果createTrackbar第三個參數是全局變量,會省去很多麻煩
void onTrackbarslide(int pos,void*) //如果函數的參數可以是任意類型指針,那麼應聲明其參數爲void*
{
double zhenNum=video1.set(CV_CAP_PROP_POS_FRAMES,pos); //第五個參數是一個函數,調到指定的幀使用set函數
}
int main()
{
if(!video1.isOpened())
cout<<"wrong"<<endl;
double zhenNum=video1.get(CV_CAP_PROP_FRAME_COUNT); //統計幀數作爲進度條的最大值
double zhenLv=video1.get(CV_CAP_PROP_FPS); //幀率,用於設置播放延遲
double delay=1/zhenLv;
Mat frame;
while(1)
{
if(!video1.read(frame)) //後面跟的是Mat型
break;
imshow("abc",frame);
waitKey(1000*delay); //延遲N毫秒,所以要乘以1000
createTrackbar("tiao","abc",&position,zhenNum,onTrackbarslide);//第五個參數實際是一個數字與進度的對應關係;
}
}
在該例子中,進度條不能隨着視頻的播放而改變位置,這也是需要改進的地方,不過能做到拖動進度條就可以讓視頻到相應位置。