首先,我们下载一下 DirectX 的 SDK 开发包,目前我们可以使用的是 DirectX 9.0 SDK(Summer 2004)之后的版本 DirectShow 已经被分离出去了。下载之后安装,安装前最好把 IDE 都给关了,免得路径没有添加进去。
然后我们开始设计阶段:
我们先通过 MFC AppWizard(exe) 建立一个 MFC 的基本对话框,去除默认的两个按钮和文本,然后我们添加一个图像控件、一个组合框、一个按钮,然后设置属性,详情如下:




然后,我们通过类向导添加成员变量,详情如下:

接下来,我们双击 Test按钮,进入代码编写。
首先,我们把摄像头的两个文件加到项目路径下,然后再在文件视图里面添加这两个文件进项目。

然后,我们给窗口类的头文件里面添加引用
#include "CaptureVideo.h"
接着,给窗口类添加一个私有的成员变量
private: CCaptureVideo m_cap;
然后再在窗口初始化的时候,初始化设备列表
m_cap.EnumDevices(m_Device.GetSafeHwnd()); m_Device.SetCurSel(0);
然后在按键的时候初始化摄像头就是的
m_cap.Init(m_Device.GetCurSel(),m_Screen.GetSafeHwnd()); m_OK.EnableWindow(FALSE);
我的设计环境为 Windows 7 SP1 、 Visual C++ 6.0 SP6 ,借鉴的别人的程序,如果有其他问题,欢迎一起讨论。
源代码点击下载
关于出现以下错误的解决方案
C:\DXSDK\Include\strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE' C:\DXSDK\Include\strmif.h(1018) : fatal error C1004: unexpected end of file found CapDlg.cpp C:\DXSDK\Include\strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE' C:\DXSDK\Include\strmif.h(1018) : fatal error C1004: unexpected end of file found CaptureVideo.cpp C:\DXSDK\Include\strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE' C:\DXSDK\Include\strmif.h(1018) : fatal error C1004: unexpected end of file found Generating Code... 执行 cl.exe 时出错.
在项目的 StdAfx.cpp 里面加上
#include "C:\DXSDK\Include\strmif.h"
编译一次就好了,之后注释掉就好了。
你好,我读了你的《VC6 下通过 DirectShow 调用摄像头》这篇文章,有点技术上的问题想咨询你,能留个邮箱或者 QQ 号吗?冒昧打扰,不好意思,谢谢,,,
@黎明, 你发邮件到 williamkyle(#)126.com 吧,QQ 我上的时候估计你都睡着了。
@WilliamKyle, 太感谢了
@WilliamKyle, 你好,按照你的文档加上各种环境配置,摄像头可以打开了,非常感谢。就是想问下,怎么关闭摄像头呢?
@Siyao Liu, CCaptureVideo 类有个 stop 的函数
您好,博主,我在编译的时候出现:error C2143: syntax error : missing ‘;’ before ‘*’
error C2501: ‘ICaptureGraphBuilder2’ : missing storage-class or type specifiers
error C2501: ‘m_pCapture’ : missing storage-class or type specifiers
不知道出现该问题的原因,查了很久也没有解决。博主能帮忙给看看吗?
感觉是哪个头文件的定义没有包含上,我已经好久没弄过这个了。。。