OpenCV 獲取攝像頭並顯示攝像頭視訊
OpenCV 獲取攝像頭,新建視窗顯示攝像頭視訊
結合Leaning OpenCV 第二個例子 顯示一個視屏檔案 寫了一下 獲取攝像頭的程式碼為並且建立視窗顯示的程式碼為:
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main( int argc, char** argv )
{
//宣告IplImage指標
IplImage* pFrame = NULL;
//獲取攝像頭
CvCapture* pCapture = cvCreateCameraCapture(-1 );
//建立視窗
cvNamedWindow("video", 1);
//顯示視屏
while(1)
{
pFrame=cvQueryFrame( pCapture );
if(!pFrame)break;
cvShowImage("video",pFrame);
char c=cvWaitKey(33);
if(c==27)break;
}
cvReleaseCapture(&pCapture);
cvDestroyWindow("video");
}
其中必須說一下幾個函式用分割線框起來了
具體是這樣的:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvCreateCameraCapture
初始化從攝像頭中獲取視訊
CvCapture* cvCreateCameraCapture( int index );
- index 要使用的攝像頭索引。如果只有一個攝像頭或者用哪個攝像頭也無所謂,那使用引數-1應該便可以。
函式cvCreateCameraCapture給從攝像頭的視訊流分配和初始化CvCapture結構。目前在Windows下可使用兩種介面:Video for Windows(VFW)和Matrox Imaging Library(MIL); Linux下也有兩種介面:V4L和FireWire(IEEE1394)。
釋放這個結構,使用函式cvReleaseCapture。
返回值為一個
CvCapture ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CvCapture
視訊獲取結構
typedef struct CvCapture CvCapture;
結構CvCapture 沒有公共介面,它只能被用來作為視訊獲取函式的一個引數。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
這個是一個很重要的結構 以後無論是讀取已有視訊還是從攝像頭獲取都必須用到它
然後的工作就是把視屏顯示出來
while(1)
{
pFrame=cvQueryFrame( pCapture );
if(!pFrame)break;
cvShowImage("video",pFrame);
char c=cvWaitKey(33);
if(c==27)break;
}
在這裡解釋一下為什麼顯示視屏的時候要迴圈
進入While迴圈之後 開始讀入視屏檔案
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cvQueryFrame函式
從攝像頭或者檔案中抓取並返回一幀
IplImage* cvQueryFrame( CvCapture* capture );
- capture 視訊獲取結構。
函式cvQueryFrame從攝像頭或者檔案中抓取一幀,然後解壓並返回這一幀。這個函式僅僅是函式cvGrabFrame和函式cvRetrieveFrame在一起呼叫的組合。返回的影象不可以被使用者釋放或者修改。抓取後,capture被指向下一幀,可用cvSetCaptureProperty調整capture到合適的幀。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果抓取幀為空 break 打破迴圈
否則將抓取的那一幀顯示在建立的視窗上
cvShowImage("video",pFrame);
當前幀顯示後
char c=cvWaitKey(33);
if(c==27)break;
我們等待33ms
如果使用者觸發了按鍵,將按鍵的ASCII值給C
如果C為ESC(ASCII 為27)迴圈退出
最後釋放capture 和window
cvReleaseCapture(&pCapture);
cvDestroyWindow("video");
最後釋放佔用資源
顯示執行結果
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!http://www.captainbed.net