本文結合實例談談在應用Vedio
for Windows
進行視頻捕捉編程方面的一些經驗,希望能對大家有所幫助。
一、Vedio for Windows 簡介
Vedio for Windows 是WIN32 SDK 中多媒體編程SDK
的視頻開發工具。在微軟的Visual C ++中提供了Vedio for Windows
的頭文件vfw.h 和庫文件vfw32.lib。表1 列出了VFW
中視頻捕捉編程常用的一些VFW 函數和宏。
二、用VC ++6.0 實現視頻捕捉的編程實例
筆者前不久剛剛用VC ++6.0
完成了一套光學自動報靶系統的開發,該系統的前端用到了視頻捕捉。下面結合這部分實例,說明對視頻捕捉編程的具體實現方法。
1、用Visual C ++的AppWizard
生成一個基于對話框的應用程序,并在SrdAfx.h 中加入以下內容:
?。nclude < vfw.h >
?。ragma comment(lib,"vfw32.lib")
2、修改對話框資源,添加靜態控制IDC_VIDEO
和按鈕“捕捉”、“停止”、“設置格式”、“設置圖像源”、“設置壓縮”、“單幀捕獲”、“定幀”、“退出”。
3、在對話框的頭文件中加入以下說明。
HWND m_hCapWnd;// 預示窗口
BOOL m_bInit;// 捕捉器初始化
CAPDRIVERCAPS m_CapDrvCap;// CAP ?
DRIVERCAPS 結構,定義驅動器性能
CAPSTATUS m_CapStatus;// CAPSTATUS 結構,
定義捕捉窗口當前狀態
CAPTUREPARMS m_Parms;
// CAPTURE PARMS 結構,定義捕捉參數
CString m_CapFileName;// 捕捉文件名稱
4、在對話框類的OnInitDialog()
函數中加入捕捉器初始化以及連接驅動器。
m_bInit=FALSE;
CWnd *pWnd=AfxGetMainWnd() ->GetDlgItem
(IDC_VIDEO); // 得到預示窗口指針
CRect rect;
pWnd ->GetWindowRect( &rect); // 得到窗口大小
m_hCapWnd=capCreateCaptureWindow
((LPTSTR)TEXT("視頻捕捉測試程序"),
WS_CHILD|WS_VISIBLE|WS_EX_CLIENTEDGE|
WS_EX_DLGMODALFRAME,0,0,rect.Width(),rect.Width(),
pWnd ->GetSafeHwnd(),0); // 設置預示窗口
ASSERT(m_hCapWnd);
if(capDriverConnect(m_hCapWnd,0)){
// 連接第0 號驅動器
m_bInit=TRUE;
// 得到驅動器的性能
capDriverGetCaps(m_hCapWnd,sizeof
(CAPDRIVE RCAPS), &m_CapDrvCap);
if(m_CapDrvCap.fCaptureInitialized){
// 如果初始化成功
capGetStatus(m_hCapWnd, &m_CapStatus,sizeof
(m_CapStatus)); // 得到驅動器狀態
capPreviewRate(m_hCapWnd,30); // 設置預示幀頻
capPreview(m_hCapWnd,TRUE); // 設置預示方式
}
else{// 初始化未成功
AfxMessageBox("視頻捕捉卡初始化失敗!");
AfxGetMainWnd() ->PostMessage
(WM_CLOSE);
}
}
else{// 未能連接到驅動器
AfxMessageBox
("與視頻捕捉卡連接失敗!");
AfxGetMainWnd() ->PostMessage
(WM_CLOSE);
}
m_CapFileName="c:\\Capture.avi";// 設置捕獲文件
capFileSetCaptureFile(m_hCapWnd,m_CapFile
Name.GetBuffer(255));
5、在對話框類中加入響應“設置格式”消息的函數OnFormat()。
capDlgVideoFormat(m_hCapWnd);
// 設置格式對話框
6、在對話框類中加入響應“設置圖像源”消息的函數OnSource()。
capDlgVideoSource(m_hCapWnd);
// 設置圖像源對話框
7、在對話框類中加入響應“設置壓縮”消息的函數OnCompress()。
capDlgVideoCompression(m_hCapWnd);
// 設置壓縮對話框
8、在對話框類中加入響應“捕捉”消息的函數OnCapture()。
capCaptureGetSetup(m_hCapWnd,
&m_Parms,sizeof(m_Parms));// 得到設置參數
if(capCaptureSetSetup(m_hCapWnd,
&m_Parms,sizeof(m_Parms))==TRUE){
BOOL suc=TRUE;
suc=capCaptureSequence(m_hCapWnd); // 捕捉到文件
return suc};
else
return FALSE;
9、在對話框類中加入響應“定幀”消息的函數OnFreezed()。
capPreview(m_hCapWnd,FALSE);// 定幀
10、在對話框類中加入響應“單幀捕獲”消息的函數OnImage()。
capGrabFrameNoStop(m_hCapWnd);
// 截獲當前圖像
capEditCopy(m_hCapWnd);
// 將圖像拷貝到剪貼板
11、在對話框類中加入響應“停止”消息的函數OnStop()。
capCaptureStop(m_hCapWnd);// 停止捕捉
12、退出前斷開捕捉器與驅動器的連接。
capDriverDisconnect(m_hCapWnd);