草莓蛋挞 發表於 2009-5-14 15:55:33

在vs2008+Vista中DirectShow的使用

<p>最近想用OpenCV库进行视频处理,但十分不幸的是新买的笔记本装的是Vista,对网络摄像机只能用DirectShow*方式控制,而不能用在XP里还能使用的vfw方式,而大多数OpenCV的例程都用vfw方式实现的,得自己去转变成 DirectShow的方式。当然了,DirectShow 也将要被Media Foundationt淘汰了。但分析一下,在XP/ Vista/ Windows7 时代还是会被保留的。<br /><br />DirectShow在DirectX9.0b之前都包括在这个库中,在DX9.0c开始,则被独立成库,要另外安装**。(注,在XP(sp2)中默认安装了DX9.0c而Vista默认安装了DX10。)后来MS又把DirectShow放入了WindowsSDK中。在vs2008 中的 WinSDK6.0a 已经包含了DirectShow,但在vs2005中的WinSDK则没有。<br /><br />由于懒得重装XP系统,所以就直接给本本装了个vs2008,尝试使用DirectShow。在http://www.opencv.org.cn/index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5%83%8F 中下载了个例程,解压,打开工程文件,F5直接编译,接着~~~~<br /><br />碰到了经典的 error C2146: syntax error : missing ';' before identifier 'PVOID64' 错误。上网查了好久,终于明白就是库连接有问题,找不到相应的.h文件,解决方法就是装DX(和DS),和改头文件连接路径。看了看,项目的目录,发现,在Debug目录下已经有个叫DirectShow的目录,里面已经包含了相关的头文件和库文件了。而vs2008已经把WinSDK安装好了,就是说DS也已经安装好了。但是由于原配的DirectShow目录中的文件是针对DX9的DS,而实际Vista中安装的是DX10和WinSDK6.0a,所以编译出错。<br />因此,在Project-&gt;Settings-&gt;Settings for:(All configurations)的C/C++和Link中,把所有的DirectShow/Include,变成 $(FrameworkSDKDir)Include;把所有的DirectShow/Lib,变成 $(FrameworkSDKDir)Lib。<br />改动的有:<br />...C/C++-&gt;Common-&gt;Additional include directories <br />...Link-&gt;Common-&gt;Additional library directories<br /><br />检查编译命令,看看是否已经包括新的目录。<br /><br />F5,再次编译。<br /><br />还是告诉在...\DirectShow\Include\dxtrans.h 头文件中,不能打开d3d.h。在次看看d3d.h 在啊,但认真看看只是在原配的DirectShow目录中,而新的WinSDK6.0a没有,那这么办???<br />咦~~~!怎么还是在原来的DirectShow目录找dxtrans.h,看看文件CameraDS.h:<br />#include &lt;atlbase.h&gt;<br />#include &quot;DirectShow/Include/qedit.h&quot;<br />#include &quot;DirectShow/Include/dshow.h&quot;<br />#include &lt;windows.h&gt;<br />#include &lt;cxcore.h&gt;<br /><br />啊,得把引用 &quot;DirectShow/Include/qedit.h&quot; 改成 &lt;qedit.h&gt; ,把引用 &quot;DirectShow/Include/dshow.h&quot; 改成 &lt;dshow.h&gt;。 存盘后,编译,再次出现错误:<br /><br />1&gt;CameraDS.cpp<br />1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\qedit.h(498) : fatal error C1083: File (Include) can not open: &quot;dxtrans.h&quot;: No such file or directory<br /><br />一查看,没在WinSDK的目录上找到dxtrans.h,上网一查,新的DS不在包含这个文件。上网找到了解决方案。<br />http://www.cnblogs.com/pcmax/archive/2008/11/22/1338989.html<br />http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&amp;SiteID=1<br /><br />现在采用的是第二种方法:<br /><br />在调用 包含qedit.h 的命令前加入四句: <font color="#0000ff" size="2"><span style="FONT-FAMILY: Arial"><br /></span></font><font color="#0000ff" size="2">#define</font><font size="2"> __IDxtCompositor_INTERFACE_DEFINED__</font><span><span><font color="#0000ff" size="2"> </font></span></span>再修改qedit.h 中引用 dxtrans.h 的部分,要求注释掉<br />#include &quot;oaidl.h&quot;<br />#include &quot;ocidl.h&quot;<br />//#include &quot;dxtrans.h&quot;<br />#include &quot;amstream.h&quot;<br /><br />再编译运行,成功!! 选择设置摄像头,视频显示,点击q键,退出。<br /><br />参考:<br /><br />*DirectShow: http://msdn.microsoft.com/en-us/library/ms783323(VS.85).aspx<br />**DirectX(Feb 2005): http://dev.csdn.net/article/62/62941.shtm<br /></p>
<p><font color="#0000ff" size="2">#define</font><font size="2"> __IDxtAlphaSetter_INTERFACE_DEFINED__</font><font color="#0000ff" size="2"> </font></p>
<p><font color="#0000ff" size="2">#define</font><font size="2"> __IDxtJpeg_INTERFACE_DEFINED__</font><font color="#0000ff" size="2"> </font></p>
<p><font color="#0000ff" size="2">#define</font><font size="2"> __IDxtKey_INTERFACE_DEFINED__</font><font face="Arial" size="2"><font color="#0000ff" size="2"> </font></font></p>
<p><font face="Arial" size="2"><font color="#0000ff" size="2">#include</font><font size="2"> </font><font color="#a31515" size="2">&lt;qedit.h&gt;</font></font></p>
頁: [1]
查看完整版本: 在vs2008+Vista中DirectShow的使用