做了个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);
这样,所有的目的都达到了。