今天咱們來作個有趣的程序實現:利用OpenCV讀取本地文件夾的視頻文件,而且在窗口中建立拖動控制條來顯示而且控制視頻文件的讀取進度。ios
此程序調試花費了筆者近一天時間,其實大致程序都已經很快寫出,結果執行時卻出現拖動條不能控制視頻讀取進度現象,結果發現是」一個大小寫字母引起的血案「——在建立拖動條時命名爲:Position,可是在設置拖動條的視頻位置時卻疏忽寫爲:position。爲此筆者反覆了N遍,因而可知程序的嚴格性,以及「搬磚碼垛」時專一的重要性。ide
一樣在附上程序以前咱們有必要對程序中出現的關鍵函數給出深度解析,這個也會成爲筆者對於學習筆記的博客書寫風格:開篇小敘——程序實現功能——關鍵函數精析——附上完整測試程序;若是有更好的書寫方案但願與你們不吝賜教,惟一的目的就是爲了讓技術道路上的咱們能更快的從彼此哪裏獲取實用信息,這個也是衡量一個大牛是否技術精通的重要指標:所謂的助攻能力!!!共勉之函數
輸入avi2.exe play2.avi命令符後,執行:Example2窗口播放play2.avi視頻文件,而且在Position拖動條上顯示進度,手動拖動能調節對應視頻播放進度。學習
#include "stdafx.h" #include "highgui.h" #include "cv.h" #include <iostream> using namespace std; /* 聲明三個全局變量並初始化 */ int g_slider_position //定義拖動條當前位置變量 int frame_count =0; //定義一個全局變量,控制滾動條的位置 CvCapture *g_capture = NULL; /* 定義拖動條函數:設置視頻獲取信息(對指定視頻g_capture 設置屬性標識符CV_CAP_PROP_POS_FRAMES的值pos) */ void onTrackbarSlide(int pos) { cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos); frame_count = pos; //將設置的視頻信息中的屬性值保存到frame_count中 return; } int main(int argc,char** argv) { if(argc == 2) { cvNamedWindow("Example2",0); g_capture = cvCaptureFromAVI(argv[1]);
// cvCreateFileCapture(argv[1]); 讀入AVI文件等價 int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT); //獲取視頻文件屬性的總幀數 if(frames != 0) { /* "position"表示滾動條的名詞,"Example3"表示滾動條所屬窗口, g_slider_position表示滾動條當前位置。 frames表示滾動條的最大值, onTrackbarSlide表示滾動條的回調函數(被拖動時調用) */ cvCreateTrackbar("Position","Example2",&g_slider_position,frames,onTrackbarSlide); } IplImage* frame = NULL ; while(1) //實時捕捉視頻幀顯示,而且更新進度條 { frame = cvQueryFrame(g_capture);//得到一幀圖像 if(!frame) break; cvShowImage("Example2",frame); cvSetTrackbarPos( "Position", "Example2", frame_count++ ); /* 進度條根據視頻進度跟新位置 拖動條設置的時候跟以前的建立名稱不一樣致使拖動條不能根據 視頻進度更新調試了一天終於發現這裏「position」應該爲「Position」 cout << g_slider_position << endl ;//能夠看到爲止更新數據 */ char c = cvWaitKey(33); //按下esc後退出 if( c == 27)break; } } cvReleaseCapture(&g_capture); cvDestroyWindow("Example2"); return 0; }