用VC++ 6.0实现视频捕捉
发布: 2007-7-04 20:47 | 作者: admin | 来源:  网友评论 | 查看: 151次 | 进入软件测试论坛讨论
领测软件测试网 刘力天 方 兰
  本文结合实例谈谈在应用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 实现视频捕捉的编程实例

  笔者前不久刚刚用VC ++6.0 完成了一套光学自动报靶系统的开发,该系统的前端用到了视频捕捉。下面结合这部分实例,说明对视频捕捉编程的具体实现方法。
  1、用Visual C ++的AppWizard 生成一个基于对话框的应用程序,并在SrdAfx.h 中加入以下内容:
        #include < vfw.h >
        #pragma 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);