Opencv讀取視頻代碼
#include "stdafx.h" #include"highgui.h"
int main(int argc,char* argv[]) { cvNamedWindow( "avi"); CvCapture* capture = cvCreateFileCapture( "D:\\sample.avi");
IplImage* frame;
while(1) { frame = cvQueryFrame(capture); if(!frame) break ; cvShowImage( "avi",frame); char c = cvWaitKey(33); if(c == 27) break; } cvReleaseCapture(&capture); cvDestroyWindow( "avi"); return 0; } CvCapture 是一個(gè)結(jié)構(gòu)體,,用來保存圖像捕獲所需要的信息。 opencv提供兩種方式從外部捕獲圖像: 一種是從攝像頭中,, 一種是通過解碼視頻得到圖像,。 兩種方式都必須從第一幀開始一幀一幀的按順序獲取,因此每獲取一幀后都要保存相應(yīng)的狀態(tài)和參數(shù),。 比如從視頻文件中獲取,,需要保存視頻文件的文件名,相應(yīng)的解碼器類型,,下一次如果要 獲取將需要解碼哪一幀等,。 這些信息都保存在CvCapture結(jié)構(gòu)中,每獲取一幀后,,這些信息 都將被更新,,獲取下一幀需要將新信息傳給獲取的 api接口
cvCreateFileCapture(char*name)
通過輸入要讀取的avi文件的路徑,然后,,該函數(shù)返回一個(gè)指向 CvCapture結(jié)構(gòu)體的指針,。
輸入一個(gè)CvCapture 類型的指針,該函數(shù)主要功能是將視頻文件的下一幀加載到內(nèi)存,。與 cvLoadImage的不同之處是,,該函數(shù)不重新分配內(nèi)存空間。
當(dāng)前幀被顯示后,,等待 33毫秒,。如果用戶觸發(fā)了一個(gè)按鍵, c會(huì)被設(shè)置成這個(gè)按鍵的 ASCII碼,,否則會(huì)被設(shè)置成 -1,。 cvWaitKey(33) 在此處的另外一個(gè)作用是,控制幀率,。
cvReleaseCapture(&capture) 釋放為 CvCapture結(jié)構(gòu)體開辟的內(nèi)存空間 關(guān)閉打開的 AVI文件相關(guān)的文件句柄
只需把 cvCreateFileCapture 改成cvCreateCameraCapture即可,。 該函數(shù)的輸入?yún)?shù)是一個(gè) ID號(hào),只有存在多個(gè)攝像頭時(shí)才起作用,。當(dāng) ID=-1時(shí),,表示 隨機(jī)選擇一個(gè)。 HighGUI做了很多工作,,使得攝像機(jī)圖像序列像一個(gè)視頻文件一樣,。
常見問題
cvCreateFileCapture返回空的問題
- ( 1)視頻文件路徑?jīng)]寫對(duì)
- ( 2)沒有安裝解碼器
- ( 3)如果使用的是 Opencv2.0或更高版本,,那么,能否正確加載 opencv_ffmpeg210.dll
- ( 4)盡管是 AVI文件,,但也可能使用了某種 codec,例如 :MJPEG Decompressor,。 需要把它轉(zhuǎn)換 OpenCV支持的 AVI文件 . OpenCV支持的AVI,。例如使用貍窩全能視頻轉(zhuǎn)換器,在《預(yù)置方案》處,,選擇 AVI-Audio_Video Interleaved(*.avi),。或者使用格式工廠也可以,。
- ( 5)讀攝像頭數(shù)據(jù),,需要安裝與攝像頭相應(yīng)的驅(qū)動(dòng)程序。
|