一個簡單讀取視頻文件代碼: #include"highgui.h" int main() { cvNamedWindow("flv"); //結構體Cv的C是大寫的 函數cv的c是小寫的 CvCapture* capture = cvCreateFileCapture("D:\\BaiduYunDownload\\2015-03-13遠程關機\\遠程關機.flv"); IplImage*frame; while (1) { frame = cvQueryFrame(capture);//該函數讀取當前幀的下一幀 if (!frame)break; cvShowImage("flv",frame); char c = cvWaitKey(33); if (c == 27) //ESC的ASCII碼爲27 break; } cvReleaseCapture(&capture); cvDestroyWindow("flv"); return 0; }
結構體CvCaptureapi
CvCapture是一個結構體,用來保存圖像捕獲所須要的信息dom
opencv從外部捕獲圖像的兩種方式:ide
一種是從攝像頭中函數
一種是經過解碼視頻獲得圖像ui
兩種方式都必須從第一幀開始一幀一幀的按順序獲取,所以每獲取一幀後都要保存相應的狀態和參數spa
(幀數/幀率就是在1秒鐘時間裏傳輸的圖片的量,也能夠理解爲圖形處理器每秒鐘可以刷新幾回,一般用fps表示指針
每一幀都是靜止的圖象)視頻
好比從視頻文件獲取,須要保存視頻文件的文件名,相應×××的類型,下一次若是要獲取將須要解碼那一幀接口
這些信息都保存在CvCapture結構中,每獲取一幀後,這些信息都將被更新圖片
獲取下一幀須要將新信息傳給獲取的api接口
函數解釋:
CVAPI(CvCapture*) cvCreateFileCapture( const char* filename );
經過輸入要讀取的視頻文件(已經轉碼的)的路徑,而後,該函數返回一個指向CvCapture結構體的指針
CVAPI(IplImage*) cvQueryFrame( CvCapture* capture );
輸入一個CvCapture類型的指針
該函數的主要功能是將視頻文件的下一幀加載到內存
與cvLoadImage的不一樣在於該函數不從新分配內存空間
char c = cvWaitKey(33);
當前幀被顯示後,等33毫秒。若是用戶觸發一個按鍵,c被設置成這個按鍵的ASCII碼,不然設爲-1
cvWaitKey(33)另外一個做用就是控制頻率
/* stop capturing/reading and free resources */ CVAPI(void) cvReleaseCapture( CvCapture** capture );
釋放CvCapture結構體開闢的內存空間
關閉打開的視頻文件有關的文件句柄
讀取攝像頭:
/* start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) */ CVAPI(CvCapture*) cvCreateCameraCapture( int index );
該函數的輸入參數是一個ID號 只有存在多個攝像頭時才起做用
當ID=-1; 表示隨機選擇一個
只有一個攝像機時,參數值取0
把上述代碼替換爲
CvCapture* capture = cvCreateCameraCapture(0);
即可讀取攝像頭(本機只有一個攝像頭)