本文转自:http://hi.baidu.com/blogofivan/blog/item/bc28009bb8ee45036f068c6d.html
VFW库在XP下很好用,但是移到Vista或者Win7下,不正常了.首先是摄像头设备连接不上,再有摄像头显示大小不能变.
1. HWND m_hWndCap = capCreateCaptureWindow(Name, WS_VISIBLE | WS_CHILD, left, top, width, height, hWnd, 1);
其中Name是子窗体名称, 第二个参数是窗口样式,这里是可见+字窗口,后面四个参数是窗口显示位置和大小,hWnd是父窗口句柄,最后一个参数窗口ID,返回值为新建窗体句柄
2. capDriverConnect(m_hWndCap, 0),这里0是指默认摄像头设备,但是如果您的电脑上有多个摄像头,就要用循环了:
for(int Index=0; Index<MAX_VFW_DEVICES;Index ++){
if(capGetDriverDescription(Index,szDeviceName,sizeof(szDeviceName),szDeviceVersion,
sizeof(szDeviceVersion))){
try{
if(capDriverConnect(m_hWndVideo,Index)){
m_ValidDriverIndex[m_TotalVideoDrivers]=Index;
capDriverDisconnect(m_hWndVideo);
}...
}
}
这里Win7和XP处理上有些不一样,Win7上capDriverConnect需要用死循环,就是把capDriverConnect写到while里。
3. capPreviewRate(m_hWndCap, 50);设置采集频率,每秒多少帧。
4. capPreview(hCap, TRUE); 开始采集了,呵呵
5. 程序退出了别忘了调用:capPreview(hCap, FALSE);
capDriverDisconnect(m_hWndCap);
OK,大功告成。
6.忘了说了,我们怎么操作捕捉到的画面呢?
答案是使用capSetCallbackOnVideoStream(HWND, CAPVIDEOCALLBACK),其中,HWND是画面显示的子窗体,CAPVIDEOCALLBACK是处理函数地址
处理函数这么写:
LRESULT CALLBACK VideoStreamCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr){
// 这里添加你自己的处理代码,其中图像数据保存在结构lpVHdr->lpData中
// 而大小保存在lpVHdr->dwBytesUsed
return TRUE;
}
其它的例子:
连接vfw32.lib的库,并在对话框头文件中加#include"vfw.h"
对上面的控件分别双击产生其对应的响应函数如下写代码:
void CUSBCameraDlg::OnVideo()
{
// TODO: Add your control notification handler code here
//create a window for captureWindow
CWnd *mywnd=new CWnd;
mywnd->Create(_T("STATIC"),"",WS_CHILD | WS_VISIBLE,CRect(0,0,250,250),this,1234);
mywnd->ShowWindow(SW_SHOW);
CRect rect;
mywnd->GetWindowRect(rect);
//create capture window
ghCapWnd=capCreateCaptureWindow("My Own Capture Window",WS_CHILD | WS_VISIBLE,0,0,(rect.right-rect.left),(rect.bottom-rect.top),mywnd->GetSafeHwnd(),1235);
//连接设备
capDriverConnect(ghCapWnd,0);
//获得参数
CAPTUREPARMS CapParms;
capCaptureGetSetup(ghCapWnd,&CapParms,sizeof(CAPTUREPARMS));
//设置帧数
CapParms.fLimitEnabled=FALSE;
//是否捕捉音频
CapParms.fCaptureAudio=FALSE;
//MCI Device支持
CapParms.fMCIControl=FALSE;
//设置窗口,如果为false,捕捉画面在桌面上
CapParms.fYield=TRUE;
//停止捕捉键设置
CapParms.vKeyAbort=VK_ESCAPE;
CapParms.fAbortLeftMouse=FALSE;
CapParms.fAbortRightMouse=FALSE;
capCaptureGetSetup(ghCapWnd,&CapParms,sizeof(CAPTUREPARMS));
//设置预览时的比例
capPreviewScale(ghCapWnd,66);
//是否支持比例变化
capPreviewScale(ghCapWnd,FALSE);
//打开预览
capPreview(ghCapWnd,1);
}
void CUSBCameraDlg::OnCapture()
{
// TODO: Add your control notification handler code here
capCaptureSequence(ghCapWnd);
}
void CUSBCameraDlg::OnStopvideo()
{
// TODO: Add your control notification handler code here
capDriverDisconnect(ghCapWnd);
}
void CUSBCameraDlg::OnStopcapture()
{
// TODO: Add your control notification handler code here
capCaptureAbort(ghCapWnd);
}
分享到:
相关推荐
基于vfw技术显示摄像头的MFC程序,能用,需要的可以参考一下
vfw 一个例子,可以显示操作摄像头,对摄像头进行设置,图像操作等
在Delphi中利用VFW技术和摄像头实现视频捕捉
VFW(delphi摄像头视频控件),VFW(delphi摄像头视频控件),VFW(delphi摄像头视频控件)
VFW-USB摄像头测试,简单的利用VFW驱动USB摄像头显示
使用VC6.0的VFW获取摄像头图像预览,截图,录像,其中录像时,程序不能被打断,会死掉,还有别的解决办法,没有尝试。 其中预览功能使用的是VFW自己的 BOOL capPreview(hwnd,f),这个使用Graphics Device Interface ...
通过mfc+vfw技术,获取USB摄像头上的视频数据,通过vfw视频回调函数,回调出相应的RGB24数据,并且将这个RGB数据转化为YV12数据,并存储进文件。
使用VFW读取摄像头,然后H263压缩,存成文件,参考http://www.codeproject.com/KB/IP/videonet.aspx
基于vfw技术的摄像头监控软件,能通过电脑支持vfw的摄像头进行录像并保存以监控。能自由选择录像保存路径和单次录像时间。
vfw读取摄像头演示程序,一个程序主要使用vfw读取每帧图片,一边显示,一边写入剪贴板,另一个从剪贴板读取图片并显示
适用于初学者,vc使用vfw控制摄像头拍照,且程序运行后5秒钟自动拍照,已编译好,可以直接运行,凑够50个字
VFW 实现打开摄像头并且捕捉摄像头的图像,学习VFW的基础入门知识。
用VFW编的,环境设置比较简单,只需在工程—>连接—>对象/库模块中加入vfw32.lib 运行即可,比DXshow、opencv方便得多,同时显示两个摄像头(各自带驱动),在几台不同电脑上例证过了,可以用,请放心下载。
VFW编程实例,详细介绍摄像头捕获,图像大小设定等.
基于VFW的摄像头抓取程序,内含源代码和文件。
Win7下VFW的使用. 文章地址: http://blog.csdn.net/bagboy_taobao_com/article/details/45270691
VFW实现从USB摄像头录制视频,只有基本功能,可以添加
用vfw编的多摄像头显示的源代码,同时显示了两个摄像头,如果你要显示更多的摄像头,只需要自己改动一下程序,挺方便的,而且配置环境也很方便,只需在工程/连接/库中加个vfw32.lib就好了,经过几台机器验证可以用,...
用VFW和简易摄像头实现图像采集和处理
VFW库 摄像头驱动VC++程序