关于opencv打开摄像头成灰色问题的原因

问题描述:

capture可以打开,但是无法抓取frame。

原因:

查找资料看到,可能是因为驱动的原因导致。windows 下的摄像头的都用了Directshow,而opencv 的这两个函数都需要使用VFW的驱动才能正常使用。

解决方法:

使用videocapture或DS

----------------------------------------------------------------------------------------

关于VFW和DS

----------------------------------

VFW是Windows 3.x的技术,面向Windows 95或者之后版本Windows的程序应该用其后续者DirectShow。面向Windows Vista之后版本Windows的程序应该用Windows media Foundation。

VFW(Video   For   Windows)是从Win95就开始使用的一组对音视频操作的一组API。     DirectShow是DirectX6.0之后发展起来的对音视频操作的COM组件SDK,     相对于DirectX是独立的。当时叫DirectX   Media   SDK。     在DirectX8.0之后就集成在同一SDK中,就改称现在的DirectShow.     Media   Player就是基于DirectShow技术之上的。根据使用驱动程序来分类,视频卡可以分为VFW和WDM。     VFW卡实现的功能简单,比起VFW,WDM还支持一些新的特性:电视接收、1394接口的设备、桌面摄像机、多条视频流同时输出等。DIRECTSHOW为了兼容VFW卡,使用了一个标识为CLSID_VfwCapture的Filter来支持VFW卡​​

http://blog.csdn.net/hardvb/article/details/768246        本文提供了使用directshow代替opencv的vfw 的源代码,与转化为iplimage格式的算法. 实验中发现opencv的cvCaptureFromCAM 使用的是vfw,采用消息机制,速度较慢,测试发现fps只有 9-12左右,太慢了.  发现经过使用directshow后速度提升到60帧/s.在opencv group上了解到这是一个普遍问题,也许有人做过转换,却没有完整的例子与代码.在此贴出.对希望提高opencv视频分析速度的有所帮助.

win7 OpenCV 问题描述:历史问题以前Windows的摄像头和视频播放接口叫VFW,又老又丑,改成DirectShow了(刚出来的时候叫Active Movie)。据说Windows 7 又改成了Media Foundation,没完了。如果是无驱的,Windows只提供了DirectShow通用驱动,因此通过VFW方式无法访问。而如果是有驱动的,那么一般来说VFW和DS是可行的。另外,因为历史原因,DirectShow兼容传统的VFW,而VFW则不可能支持DirectShow,所以你的摄像头即使只支持VFW,也可以用DirectShow采集,因此不存在什么DirectShow不支持的摄像头。如果你的摄像头是无驱的,没办法,换一个有驱的。下面说说问题的另一头:OpenCV,OpenCV 1.0的HighGUI只提供了VFW接口的摄像头支持( Windows上,Linux上则多许多),为此他还提供了一个叫cvcam的独立函数库,文档里有的。OpenCV 计划用HighGUI支持DirectShow,以便淘汰cvcam库。期间,出现了一个叫Video Input的开源库,通过简单的C函数访问DS摄像机,并且和OpenCV配合良好,以至于OpenCV的官网上有他的介绍。最终OpenCV 2.0纳入了VideoInput,从而让HighGUI支持了DS,但是O penCV 2.0的用法真的是…… 所以还有三个选择: cvcam VideoInput OpenCV 2.0 另外,OpenCV 1.0读取和保存AVI的接口也仅仅支持VFW,视频编解码也有VFW和DS的区分,只支持VFW的,因此行为可能和Media Player等不同,因为目前大多数的播放器使用DS。 2.0开始用内置的FFMpeg了,支持格式较为广泛,我曾经顺利地打开rmvb和mkv,也算是一种进步。BTW,FFDShow就是DS包装下的FFMpeg。​

http://blog.csdn.net/heiyang/article/details/6715424说起视频捕捉问题,先来看一下视频捕捉卡。根据使用的驱动程序的不同来分类,目前市场上大致有两种捕捉卡:VFW (Video for Windows)卡和WDM (Windows Driver Model)卡。前者是一种趋于废弃的驱动模型,而后者是前者的替代模型;WDM还支持更多新的特性,比如直接支持电视接收、视频会议、1394接口的设 备、桌面摄像机、多条视频流(Line-21或Closed-Caption等)同时输出等等。采用VFW的一般都是些以前生产的卡;

市面上新出现的,一 般都是采用了WDM驱动程序。另外,视频捕捉卡的接口,可以是以PCI或AGP的方式插入PC机箱,也可以直接以USB接口的方式外挂;还有就是通过 1394接口与PC机相连的数码摄像机等等。      

 基于VFW的视频捕卡       VFW技术受到的很多批评,因它捕获的数据保存到磁盘上会占用大量磁盘空间,每秒数据量超过20M,(有人试验640*480窗口1s大约需要10M), 同时需要大量的客户端支撑软件,VFW体系架构上的不足在视频会议应用上和PC/TV应用上被暴露无遗,这样就要求一种新的视频捕获技术来弥补这些不足。 VFW的体系结构缺乏为视频会议,电视浏览,视频区域捕获和VBI(Vertical Blanking Interval)数据流提供强而有效的支持。一些视频卡等设备开发商在设计自己的产品时,针对这些缺陷,对VFW进行了功能扩展。由于没有统一的标准, 我们的应用程序在使用这些扩充的功能时,就必须要写一些基于特定硬件的代码。这就意味着当要改变捕获驱动程序时,就必须要对显卡的驱动程序进行修改。     

 基于WDM的视频捕获      WDM视频捕获设计就是为了来解决VFW体系结构中存在的这些问题。WDM视频捕获主要的好处体现在:​

l         可以为设备(如基于USB,IEEE 1394通讯方式的摄像头 )提供32位的驱动程序。l         允许DirectShow 和 WDM流协同工作。​

​l        可以在视频捕获设备和DVD/MPEG设备间,为硬件(如video ports和 chip sets)共享一个分类的驱动程序结构(Stream.sys)。​

l         支持多个数据流。​

l         允许电视信号调频和输入选择。​

l         支持视频区域捕获,区域显示和VBI。

​l         允许使用DirectDraw® VPE (Video Port Extensions)管理视频输入。​

 在一个单独设备上可能会有多个组件共存的情况,这些组件包括DVD解码器,MPEG解码器,视频解码器,调谐器,音频解码器。WDM数据流就是用于解决这种情况而创建的。它是个统一的驱动模型,可以支持所有的这些设备和去处理它们的资源分配。WDM数据流为标准数据类型和用户自定义数据类型提供了统一的数据模型,同样,它定义了大部分的标准设备的属性,并且根据需要可以很容易地实现扩充。因为按WDM数据流的协议,它支持在设备内核间进行数据传输,而不需要在用户模式下进行数据转换。这样可以获得较高的效率,减少不必要的工作。操作系统仍然支持VfW驱动程序,但是依赖于VFW的开发将逐渐减少,这是因为下面三个原因: 

 l         WDM数据流为基于电视浏览和视频会议的捕获设备提供了优化支持。

l         DirectShow提供了更强的功能。 

 l         Microsoft 将不会对VFW进行持续开发。        

上面这段话节选之http://blog.csdn.net/suntaoznz/article/details/596180。http://blog.csdn.net/suntaoznz这个博客中有几篇文章介绍了VFW和WDM。         

http://wenku.baidu.com/view/07af18d380eb6294dd886cb8.html比较详细的介绍了WDM视频捕获。         

一.VFW     

  VFW(Video for Windows)是微软公司1992年推出的关于数字视频的一个软件包,它能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。简单说,它就是从Win95就开始使用的一组对音视频操作的一组API。VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。它引进了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,以及在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW给程序员提供.VBX和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。在Windows 9x系统中,当用户在 安装VFW时,安装程序会自动地安装配置视频所需要的组件,如设备驱动程序、视频压缩程序等。       具体的开发步骤参考:    http://blog.ednchina.com/opencv2008/193859/message.aspx。自己也顺便转载了一下的。

​ 二.DirectShow       

 DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,与DirectX开发包一起发布。DirectShow使用一种叫Filter Graph的模型来管理整个数据流的处理过程,运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。这样使在多媒体数据库管理系统(MDBMS)中多媒体数据的存取变得更加方便。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等,为多媒体流的捕捉和回放提供了强有力的支持。     

  http://hi.baidu.com/��/blog/item/951b33348e684b3e5ab5f54e.html中详细介绍了DirectShow捕捉如何编程。下面这段摘自维基百科http://zh.wikipedia.org/wiki/DirectShow 的话说明了 DirectShow的缺点。   

     播放一个文件是一项相对简单的任务,不过对于像是从视频窗口接收特定窗口信息到创建特定filters,开发者会不断地遇到DirectShow API的黑暗面。DirectShow因其复杂性而声名狼藉与此同时很多人认为它是微软最复杂的libraries/APIs。在“Microsoft.public.win32.programmer.directx.video”新闻群组上存在一个长期的灰色笑话,讲的是每当某人想要为DirectShow开发一个新的filter时,那么“六个月后见吧”。开发者很少直接创建DirectShow filters - 他们通常使用被称为“DirectShow基础类”的一组像MFC一样的(不需要MFC)类别而开发者通常将会使用这些类来处理大多数工作。基本类的大小几乎是在代码中整个MFC library类大小的一半。即使有了基本类,DirectShow中存在的COM对象的绝对数量也是巨大的,甚至可以颠覆那些开发者想要开发的那种本以为相当直接的东西。DirectShow's的API有时违反一些传统的COM规则,比如关于关于参数到方法,虽然那些通常被证明了的。因此,为了制止这些情形,开发者时常使用DirectShow本身中较高层次的API,即Windows Media Player SDK,它提供了一个有较少COM接口处理的ActiveX控制。 DirectShow也因它对数据管理权限的支持而受到批评。然而当DirectShow本身有的API对DRM只有最小支持的时候,它在这情况只是一个名义上的领导者。在这个案例中真正的“坏人”事实上是被从DirectShow分开的Windows Media Player SDK因为它是对DRM有最多支持的地方。在相同方面,DirectShow也因对第三方媒体播放器功能的限制而受到指责,也就是说,在播放媒体文件方面,对Windows Media Player以外的媒体播放器存在不公。      

  《深入浅出DirectShow Filter》http://caodixy.blog.163.com/blog/static/5094048820106133850563/?fromdm&fromSearch&isFromSearchEngine=yes

你可能感兴趣的:(opencv)