1. 程式人生 > >OpenCV 獲取攝像頭並顯示攝像頭視訊

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