【05】Opencv視頻播放控制

一個簡單的實現代碼:運維

#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的四個字符(只對攝像頭有效)
相關文章
相關標籤/搜索