1. 程式人生 > >VC++ 6.0實現視訊捕捉(VFW)

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);//用於連線裝置

要做的就是根據相關的功能改變相應的引數就可以了。

當然,在這過程中肯定會遇到很多問題的,我剛開始編譯的時候出現了一百多個錯誤,耐心調通也就不難了。

下面的圖是幾幅介面圖,可做參考。