【04】Opencv讀視頻和攝像頭

一個簡單讀取視頻文件代碼:
#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);

即可讀取攝像頭(本機只有一個攝像頭)

相關文章
相關標籤/搜索