一個簡單的實現代碼:運維
#include"cv.h" #include"highgui.h" //設置全局變量,一個爲滾動條的位置。回調函數須要用到的變量cvCapture也是全局變量,因此前面有g_,表明global CvCapture*g_capture = NULL;//用來保存圖像捕獲的信息的結構體 int g_slider_pos = 0; int frame_count = 0;//記錄播放的幀數 //當鼠標滑動滑塊的時候 調用該回調函數 void onTrackbarSlider(int pos)//這個參數由cvCreateTrackbar傳入 它反映了當前滑塊被滑到的位置 { //設置當前視頻文件的屬性 cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES,//單位爲幀數的位置(只對視頻文件有效) pos //設置指定視頻獲取的屬性 ); frame_count = pos; } int main() { cvNamedWindow("show");//建立窗口 g_capture = cvCreateFileCapture("E:\\Linux基礎知識與系統管理\\01 運維基礎\\01_01_面授班開場.avi");//獲取視頻文件 //獲取視頻的所有幀數frames int frames = (int)cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_COUNT//視頻文件中幀的總數 ); if (frames > 0) { //建立進度條 //當你滑動滑塊的時候 會觸發一個事件執行cvCreateTrackbar 而後cvCreateTrackbar調用onTrackbarSlider 而後返回while接着之前繼續循環 //cvCreateTrackbar這個函數系統調用 onTrackbarSlider咱們本身填寫代碼實現 cvCreateTrackbar( "Pos", //進度條名稱 "show",//所在窗口 &g_slider_pos,//滑塊的位置 frames,//滑塊位置的最大值。最小值一直是0 onTrackbarSlider//回調函數 這裏面回調函數的聲明參數必須是×××的 返回值爲void //當你用鼠標拉動滑塊的時候 就會產生一個消息 來執行這個回調函數 ); } IplImage*frame; while (true) { frame = cvQueryFrame(g_capture);//從攝像頭或者文件中抓取並返回一幀 //cvQueryFrame的參數爲CvCapture結構的指針。用來將下一幀視頻文件載入內存,返回一個對應當前幀的指針 if (!frame) { break; } cvShowImage("show",frame); char c = cvWaitKey(33);//控制頻率 if (c == 27)//ESC鍵 { break; } //設置滑塊的位置 實現滑塊隨視頻的播放而移動 cvSetTrackbarPos( "pos", "show", frame_count//滑塊的位置 ); frame_count++;//每播放一幀的時候 加一 } //釋放資源 cvReleaseCapture(&g_capture); cvDestroyWindow("show"); return 0; }
函數解釋:ide
獲取視頻文件和攝像頭屬性的函數函數
/* retrieve or set capture properties */ CVAPI(double) cvGetCaptureProperty( CvCapture* capture, int property_id ); capture 要獲取的視頻文件指針 property_id 要獲取的屬性 傳入相應的宏返回相應的屬性 CV_CAP_PROP_POS_MSEC - 影片目前位置,爲毫秒數或者視頻獲取時間戳 CV_CAP_PROP_POS_FRAMES - 將被下一步解壓/獲取的幀索引,以0爲起點 CV_CAP_PROP_POS_AVI_RATIO - 視頻文件的相對位置(0 - 影片的開始,1 - 影片的結尾) CV_CAP_PROP_FRAME_WIDTH - 視頻流中的幀寬度 CV_CAP_PROP_FRAME_HEIGHT - 視頻流中的幀高度 CV_CAP_PROP_FPS - 幀率 CV_CAP_PROP_FOURCC - 表示codec的四個字符 CV_CAP_PROP_FRAME_COUNT - 視頻文件中幀的總數
一個bug:ui
有時候cvGetCapturePropetry在cvQueryFrame被調用一次後在調用cvGetCapturePropetry纔會返回正確的數值url
建立一個滾動條spa
* create trackbar and display it on top of given window, set callback */ CVAPI(int) cvCreateTrackbar( const char* trackbar_name, //滾動條的名字 const char* window_name, //所在窗口的名字 int* value, //指定建立時的滑塊位置 int count, //滑塊位置的最大值。最小值一直是0 CvTrackbarCallback on_change CV_DEFAULT(NULL)); //每次滑塊位置改變時,調用該回調函數 //typedef void (CV_CDECL *CvTrackbarCallback)(int pos); //on_change 每次滑塊位置被改變的時候,被調用函數的指針。 //這個函數應該被聲明爲void Foo(int); 若是沒有回調函數,這個值能夠設爲NULL
回調函數:指針
回調函數就是一個經過函數指針調用的函數code
若是你把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用來調用其所指向的函數時,咱們就說這是回調函數orm
回調函數不是由該函數的實現方法直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應視頻
機制:
⑴定義一個回調函數;
⑵提供函數實現的一方在初始化的時候,將回調函數的函數指針註冊給調用者;
⑶當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理
設置攝像頭屬性的函數
CVAPI(int) cvSetCaptureProperty( CvCapture* capture, //視頻獲取結構 nt property_id, // 屬性標識符 double value ); CV_CAP_PROP_POS_MSEC - 從文件開始的位置,單位爲毫秒 CV_CAP_PROP_POS_FRAMES - 單位爲幀數的位置(只對視頻文件有效) CV_CAP_PROP_POS_AVI_RATIO - 視頻文件的相對位置(0 - 影片的開始,1 - 影片的結尾) CV_CAP_PROP_FRAME_WIDTH - 視頻流的幀寬度(只對攝像頭有效) CV_CAP_PROP_FRAME_HEIGHT - 視頻流的幀高度(只對攝像頭有效) CV_CAP_PROP_FPS - 幀率(只對攝像頭有效) CV_CAP_PROP_FOURCC - 表示codec的四個字符(只對攝像頭有效)