天天看點

基于VFW的MFC程式設計實作簡易攝像頭抓拍

基于VFW的MFC程式設計實作簡易攝像頭抓拍

做了個MFC小程式,實作調用VFW來實作簡易抓拍。

初衷是可以像本本自帶的攝像頭拍照一樣,可以視訊也可以把目前的一幀圖像拍下來儲存起來。初次使用VFW,剛開始找調用函數,在網上一搜是挺多的,但我不可能一個一個去試,最後花費了些時間找出了可用的一點調用攝像頭驅動,實作視訊浏覽的代碼。第一個目的達到後,開始找儲存圖像的代碼,很多資料都是怎麼儲存視訊為avi格式檔案,離我的簡單儲存為bmp檔案還是有些出入。最後終于找到了一個從目前幀儲存為bmp檔案的函數,就是capFileSaveDIB,很簡單的一個函數

BOOL capFileSaveDIB( hwnd, szName )。最後跟大家共享這份代碼,給急急忙忙尋找代碼,快速達到跟我相同目的的朋友。

第一步:

在對話框類頭檔案開頭包含進Vfw.h檔案,再在工程設定中包含進Vfw32.lib檔案。

第二步:

在對話框類頭檔案中定義一個句柄HWND   m_hWndVideo; //視訊顯示視窗句柄,再在對應cpp檔案中的OnInitDialog()中填入代碼,如:

//建立預覽視窗

   m_hWndVideo = capCreateCaptureWindow((NULL,WS_POPUP,1,1,10,10,m_hWnd,0);

   //連接配接驅動程式

   if(capDriverConnect(m_hWndVideo,0)) {

    ::SetParent(m_hWndVideo,*this);

    ::SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD);

    CRect wndRC;

    m_Panel.GetClientRect(wndRC);

    m_Panel.MapWindowPoints(this,wndRC);

    wndRC.DeflateRect(1,1,1,1);

    ::SetWindowPos(m_hWndVideo,NULL,wndRC.left,

     wndRC.top,wndRC.Width(),wndRC.Height(),SWP_NOZORDER);

    ::ShowWindow(m_hWndVideo,SW_SHOW);

    capPreviewRate(m_hWndVideo,20);

    capPreview(m_hWndVideo,TRUE);

   }

這樣實作了簡單的視訊浏覽功能。

第三步:

儲存目前幀為bmp檔案:

char day[256],time[256];

 _strtime(time),_strdate(day);

 strcat(day,time);

 int len=strlen(day);

 for(int i=0,j=0;i<len;i++) {

  if(day[i]!=':' && day[i]!='/') day[j++]=day[i];

 }

 day[j]='\0';

 strcat(day,".bmp");

 capFileSaveDIB(m_hWndVideo,day);

第四步:

關閉程式時要跟攝像頭驅動斷開:

capDriverDisconnect(m_hWndVideo);

這樣,所有的目的都達到了。