VC++ 6.0實現視訊捕捉(VFW)
一、Vedio for Windows 簡介
Vedio for Windows 是WIN32 SDK 中多媒體程式設計SDK 的視訊開發工具。在微軟的Visual C ++中提供了Vedio for Windows 的標頭檔案vfw.h 和庫檔案vfw32.lib。表1 列出了VFW 中視訊捕捉程式設計常用的一些VFW 函式和巨集。
二、用VC ++6.0 實現視訊捕捉的程式設計例項
下面結合例項,說明對視訊捕捉程式設計的具體實現方法。
1、用Visual C ++的AppWizard 生成一個基於對話方塊的應用程式,並在StdAfx.h 中加入以下內容:
#include < vfw.h >
#pragma comment(lib,"vfw32.lib")
2、修改對話方塊資源,新增靜態控制IDC_VIDEO 和按鈕“捕捉”、“停止”、“設定格式”、“設定影象源”、“設定壓縮”、“單幀捕獲”、“定幀”、“退出”。
(其實最重要的是“設定格式”、“設定影象源”、“設定壓縮”、“單幀捕獲”、“退出”,其它可以將其設定成不可見,同時也可將其保留,以便將來擴充套件其功能時可用。)
3、在對話方塊的標頭檔案中加入以下說明。
HWND m_hCapWnd;// 預示視窗
BOOL m_bInit;// 捕捉器初始化
CAPDRIVERCAPS m_CapDrvCap;// CAPDRIVERCAPS 結構,定義驅動器效能
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_CapFileName.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;
注意點:在VideoCaptureDlg.h中把afx_msg void OnCapture();改為afx_msg BOOL OnCapture();
在VideoCaptureDlg.cpp 修改為BOOL CVideoCaptureDlg::OnCapture() //捕捉
9、在對話方塊類中加入響應“定幀”訊息的函式OnFreezed()。
capPreview(m_hCapWnd,FALSE);// 定幀
10、在對話方塊類中加入響應“單幀捕獲”訊息的函式OnImage()。
capGrabFrameNoStop(m_hCapWnd);// 截獲當前影象
capEditCopy(m_hCapWnd);// 將影象拷貝到剪貼簿
11、在對話方塊類中加入響應“停止”訊息的函式OnStop()。
capCaptureStop(m_hCapWnd);// 停止捕捉
12、在對話方塊類中加入響應“退出”訊息的函式OnExit()退出前斷開捕捉器與驅動器的連線,並關閉視窗。
capDriverDisconnect(m_hCapWnd);
CDialog::OnCancel();
附加說明:以上新增的按鈕用於捕捉影象(button);
另外新增(Static Text)用於建立並設定捕獲視窗;
儲存影象的方法:點選“單幀捕獲”——>開啟附近裡的“畫圖”——>“編輯”中的“貼上”——>即可儲存捕捉的點陣圖。
以上方法主要是採用了VFW的函式和巨集,有興趣的朋友可以嘗試用訊息的方法,同樣也可以實現。
如:SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0L);//用於連線裝置
要做的就是根據相關的功能改變相應的引數就可以了。
當然,在這過程中肯定會遇到很多問題的,我剛開始編譯的時候出現了一百多個錯誤,耐心調通也就不難了。
下面的圖是幾幅介面圖,可做參考。