
做了個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);
這樣,所有的目的都達到了。