天天看点

基于VFW的MFC编程实现简易摄像头抓拍

基于VFW的MFC编程实现简易摄像头抓拍

做了个MFC小程序,实现调用VFW来实现简易抓拍。

初衷是可以像本本自带的摄像头拍照一样,可以视频也可以把当前的一帧图像拍下来保存起来。初次使用VFW,刚开始找调用函数,在网上一搜是挺多的,但我不可能一个一个去试,最后花费了些时间找出了可用的一点调用摄像头驱动,实现视频浏览的代码。第一个目的达到后,开始找保存图像的代码,很多资料都是怎么保存视频为avi格式文件,离我的简单保存为bmp文件还是有些出入。最后终于找到了一个从当前帧保存为bmp文件的函数,就是capFileSaveDIB,很简单的一个函数

BOOL capFileSaveDIB( hwnd, szName )。最后跟大家共享这份代码,给急急忙忙寻找代码,快速达到跟我相同目的的朋友。

第一步:

在对话框类头文件开头包含进Vfw.h文件,再在工程设置中包含进Vfw32.lib文件。

第二步:

在对话框类头文件中定义一个句柄HWND   m_hWndVideo; //视频显示窗口句柄,再在对应cpp文件中的OnInitDialog()中填入代码,如:

//创建预览窗口

   m_hWndVideo = capCreateCaptureWindow((NULL,WS_POPUP,1,1,10,10,m_hWnd,0);

   //连接驱动程序

   if(capDriverConnect(m_hWndVideo,0)) {

    ::SetParent(m_hWndVideo,*this);

    ::SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD);

    CRect wndRC;

    m_Panel.GetClientRect(wndRC);

    m_Panel.MapWindowPoints(this,wndRC);

    wndRC.DeflateRect(1,1,1,1);

    ::SetWindowPos(m_hWndVideo,NULL,wndRC.left,

     wndRC.top,wndRC.Width(),wndRC.Height(),SWP_NOZORDER);

    ::ShowWindow(m_hWndVideo,SW_SHOW);

    capPreviewRate(m_hWndVideo,20);

    capPreview(m_hWndVideo,TRUE);

   }

这样实现了简单的视频浏览功能。

第三步:

保存当前帧为bmp文件:

char day[256],time[256];

 _strtime(time),_strdate(day);

 strcat(day,time);

 int len=strlen(day);

 for(int i=0,j=0;i<len;i++) {

  if(day[i]!=':' && day[i]!='/') day[j++]=day[i];

 }

 day[j]='\0';

 strcat(day,".bmp");

 capFileSaveDIB(m_hWndVideo,day);

第四步:

关闭程序时要跟摄像头驱动断开:

capDriverDisconnect(m_hWndVideo);

这样,所有的目的都达到了。