MFC下用VFW实现控制摄像头录像和拍照

先贴上一张图吧,如果你觉得有帮助就继续参考下面的步骤吧

开发vfw程序时,我们需要vfw.h和vfw32.lib这两个文件,很多人会去网上下载,但是网上基本上很难找到,其实在安装了vs后我们就已经拥有了这两个文件,如果你需要找出来的话你可以在vs文件夹下搜索即可,没找出来也不碍事的。下面就开始吧

1.创建基于对话框的MFC应用程序,基本功不多说。

2.添加头文件和绑定库文件于XXXXDlg.cpp文件中

#include "vfw.h"
#pragma comment(lib, "vfw32")

3.在资源对话框里布局如上图,左边的视频区域用的是静态文本框,也可以用picture控件

4.启动视频连接(如果你不是通过按钮控制实现,是打开就实现那么将下面代码写在OnInitDialog()里面),添加按钮事件,你可以双击按钮实现(下面一样)

CWnd *pwnd = this->GetDlgItem(IDC_VIEW);//这里的IDC_VIEW是静态文本的ID
 CRect rect;
 
 pwnd->GetClientRect(&rect);
 m_myCapWnd = capCreateCaptureWindow("视频测试",WS_CHILD|WS_VISIBLE|WS_DLGFRAME,0,0,rect.Width(),rect.Height(),pwnd->GetSafeHwnd(),0);
 
 if(m_myCapWnd==NULL)
 {
  AfxMessageBox("视频窗口创建失败!");
  return;
 }
 while(!capDriverConnect(m_myCapWnd,0))
 {
  capDriverConnect(m_myCapWnd,0);//可以不要while,而直接使用这句
 }//成功为止
 //capDriverConnect(m_myCapWnd,0);
 CAPDRIVERCAPS caps;
 capDriverGetCaps(m_myCapWnd,sizeof(CAPDRIVERCAPS),&caps);
 if(caps.fCaptureInitialized)
 {
  CAPSTATUS status;
  capGetStatus(m_myCapWnd,&status, sizeof(CAPSTATUS));
  capPreviewRate(m_myCapWnd,30);
  capPreviewScale(m_myCapWnd,TRUE);//设置视频比例,使视频完全显示出来,若设为false则显示部分画面出来
  capPreview(m_myCapWnd,TRUE);//视频预览,即视频出现了
 }

5.断开视频连接并退出程序

capDriverDisconnect(m_myCapWnd);
CDialog::OnCancel();

6.拍照并保存这张图片

if(capGrabFrameNoStop(m_myCapWnd)==TRUE && capFileSaveDIB(m_myCapWnd,"cutbmp.jpg")==TRUE)//可以指定路径,否则是当前项目里
 {
  AfxMessageBox("拍照成功,并已保存!");
 }
 else
 {
  AfxMessageBox("拍照失败或者保存失败,请再次尝试,或者重新连接摄像头!");
 } 

7.设置视频源等

capDlgVideoSource(m_myCapWnd);
 capDlgVideoDisplay(m_myCapWnd);

8.设置格式

capDlgVideoFormat(m_myCapWnd);
 capDlgVideoDisplay(m_myCapWnd);

9.设置压缩

 capDlgVideoCompression(m_myCapWnd);
 capDlgVideoDisplay(m_myCapWnd);

10.开始录像并保存于一个文件

capFileSetCaptureFile(m_myCapWnd,"video.avi");
 capCaptureSequence(m_myCapWnd);

11.停止录像

capCaptureStop(m_myCapWnd);

好了 ,最基本的能实现了,其它的按钮功能需要另写代码,这里就不多说了,毕竟这里的主角是vfw,如果你想要更深入的开发,你可以网上搜索文档有很多,这里仅仅抛砖引玉了。

posted @ 2013-07-04 11:07  CS-Surpass  阅读(3669)  评论(0)    收藏  举报