基于DirectShow的眼前节图像采集系统的设计
陈 昱,王博亮*,谢杰镇
(厦门大学计算机科学系,福建 厦门 361005)
摘要: 利用裂隙灯显微镜观察眼前节是眼科诊断中常用的检查手段,但长期以来存在着数据获取,保存和共享上的困难。而DirectShow是Windows平台上进行流媒体应用开发的最新标准,本文利用DirectShow技术设计了眼前节图像采集系统。文中着重阐述了根据需求构建采集系统的Filter Graph模型的方法,包括采集设备的选取,视频流的预览和采集,以及最后使用Sample Grabber方法捕捉眼前节图像。并提出了将DirectShow与MFC相结合进行开发的方法。该系统可以辅助眼科医师进行病理诊断,使得医师可以有时间对图像进行细致的分析,从而提高病理诊断的正确率。经实际临床测试,效果较为理想。
关键词: DirectShow;图像采集; 眼前节图像
中图分类号:TP37 文献标识码:A 文章编号:0438-0479(2005)-03-0300-01
裂隙灯显微镜是眼科诊断中应用极为普遍的一种仪器,主要用来检查眼前部的病变。医生通过裂隙灯显微镜上的双目立体显微镜可以对患者眼角膜、前房、晶体等进行观察和检查。但是,使用裂隙灯显微镜观察病变,还存在许多不足之处:如果想将图像保存,需要用照相机进行拍照,这样获取图像周期长,图像的存储查询代价高,交流共享困难。随着数字图像和计算机分析技术的发展,使得利用计算机、摄像机进行图像采集归档成为可能[1]。
近年来,Windows以其直观、友好的图形用户界面和多任务多窗口的操作环境,吸引了越来越多的计算机用户和生产厂家。从Windows 3.0增加多媒体扩展部分开始,Windows的多媒体功能日益增强,先后产生了MCI多媒体控制接口和Video for Windows(VFW)架构,使得PC机能够进行音频和视频的采集和回放[2]。然而,随着计算机应用的发展,对视频采集技术有了更高的要求,VFW架构的不足逐渐显现出来。例如不能提供对视频会议的支持,不能处理附加数据流,不能适应最新的多媒体技术的发展。针对这些限制,设备的制造商对VFW的体系结构进行了自己的扩展。但由于没有相关的接口标准,导致应用程序必须包含硬件相关的代码,从而缺乏可移植性,很大程度上限制了新功能的推广[3]。因此,制定新的视频捕捉技术规范已势在必行。
在此背景下,Microsoft最新的多媒体标准DirectShow应运而生。它与WDM(Windows Driver Model,Windows驱动程序模型)相结合从而大大扩展了视频应用的功能,从而为实现无特定硬件支持条件下眼前节图像采集系统的设计提供了可能。
1 DirectShow系统概述
DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括ASF、MPEG、AVI、DV、MP3、Wave等等,使得多媒体数据的采集和回放变得轻而易举。更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件,拓展DirectShow的功能[4]。
DirectShow使用Filter Graph模型管理整个数据流的处理过程;参与数据处理的各个功能模块叫做Filter;各个Filter在Filter Graph中按一定的顺序连接成一条“流水线”协同工作。在DirectShow标准结构体系中,DirectShow Filter联系与控制着多样化的设备,包括本地文件系统、TV调频和视频采集卡、VFW编码器、视频显示卡(通过DirectDraw或GDI)以及声卡(通过DirectSound)。因此,DirectShow通过统一的编程接口将开发人员从处理各种纷繁复杂的硬件设备的工作中解脱出来。
在DirectShow标准结构体系中,所有的处理活动都是由一个叫做Filter的COM对象完成的。Filter是DirectShow最基本的组成部分。按照功能来分,Filter大致可分为以下五类:Source Filter,Transform Filter,Renderer Filter,Splitter Filter,Mux Filter。Filter Graph Manager是一个负责控制Filter Graph 中的Filter的COM对象。它实现了下列的功能:协调Filter 之间的状态改变;确立参考时钟;将事件反馈给应用程序;为应用程序建立Filter Graph 提供方法。
2 眼前节图像采集系统的设计
2.1 系统组成
基于DirectShow技术的优点,我们选用DirectShow作为眼前节图像采集系统的解决方案。我们的采集系统需要实现以下这些功能:
?? 允许进行眼前节图像采集设备的选择;
?? 在采集卡支持多路输入的情况下,允许选择期望的输入;
?? 支持动态眼前节视频流的采集;
?? 支持单帧眼前节图像的抓取;
?? 允许设置视频的颜色空间、分辨率与帧速率;
?? 允许设置视频的亮度、对比度等属性。眼前节图像采集系统的硬件组成示意图见图1。
图1 眼前节图像采集系统硬件组成示意图
Fig.1 The hardware diagram of anterior segment image capturing system2.2 Filter Graph模型
为实现上述这些功能,在程序中必须对Filter Graph进行手工的配置,而不能完全依赖系统的“智能连接”机制。因此形成了如下的Filter Graph模型,见图2。
图2 程序中的Filter Graph模型
Fig.2 The Filter Graph model in our application
其中,Cros***ar Filter用于控制采集卡的多路输入;Sample Grabber用于实现静态图像的捕捉;通过Capture Filter可以设置图像的亮度、对比度等属性;通过Capture Filter上的Capture Pin可以设置图像的颜色空间、分辨率与帧速率;另外,为了保证兼容性加入了Smart Tee Filter用于将采集接口的视频流同步复制为两个独立的视频流,从而可以同时预览和采集眼前节图像数据。
2.3 Capture Graph Builder
实现动态视频流的采集是一个复杂的过程。开发过程中需要处理系统中可能安装的不同的视频采集硬件和不同的数据格式。在使用DirectShow实现视频信号的采集时,通过Capture Graph实现对不同的硬件驱动和媒体数据的配置管理工作。
一个执行视频或音频采集任务的Filter Graph称为Capture Graph。Capture Graph 通常比用于文件回放的Graph 更为复杂。为了让应用程序更为简便地建立Capture Graph,DirectShow提供了Capture Graph Builder辅助对象。应用程序可以间接地通过Capture Graph Builder来控制Filter Graph Manager,从而避免了对Filter Graph的直接操作,简化了Capture Graph的建立过程。
要使用Capture Graph Builder,首先要调用CoCreateInstance创建Capture Graph Builder和Filter Graph Manager的实例。然后用Filter Graph Manager的 IGraphBuilder接口的指针来调用ICaptureGraphBuilder2::SetFiltergraph,完成Capture Graph Builder的初始化。2.4 选择采集设备
根据使用的驱动程序的不同来分类,目前市场上大致有两种采集卡:VFW (Video for Windows)卡和WDM (Windows Driver Model)卡。前者是一种即将淘汰的驱动模型,后者是前者的替代模型。采用VFW的一般都是早期生产的采集卡;市面上新面市的采集卡,一般都是采用了WDM驱动程序。对于这两种设备,DirectShow都可以很好地支持。
当视频捕捉卡正确安装到系统中后,要知道系统中安装了哪些捕捉卡,需要利用系统设备枚举器。系统设备枚举器是一个用来得到指定类别设备的名字对象的集合的辅助对象。如果想生成一个设备列表让用户选择,你必须得到设备的名称。通过调用IMoniker::BindToStorage方法,可以得到一个指向IPropertyBag接口的指针。调用IPropertyBag::Read可以读取名字对象的属性。
当用户选择了一个设备后,就需要创建Capture Filter的实例。Capture Filter的创建不是像其他Filter一样使用CoCreateInstance,而是在枚举的过程中使用名字对象的BindToObject方法。在这一点上,对WDM卡和VFW卡的处理是一致的。然后就可以调用AddFilter将其加入Filter Graph中。
2.5 眼前节视频流的预览与采集
要建立一个进行视频预览的Graph,只需调用ICaptureGraphBuilder2::RenderStream方法将代表采集设备的Capture Graph Filter与用于视频还原的Video Render Filter相连接即可。在计算机只有一个显卡的情况下,参数只需使用缺省值。
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pCap, // 采集设备的Capture Filter
NULL, // 不需要对视频流进行处理
NULL); // 缺省显卡
要将采集的数据存储到磁盘上,需要指定一个文件名,以便在Filter Graph中创建代表文件的File Writer Filter和相应视频格式的编码器:
IBaseFilter *pMux;
hr = pBuild->SetOutputFileName(
&MEDIASUBTYPE_Avi, // 指定AVI为目标格式
L"C:\Example.avi", // 文件名
&pMux, // 得到指向Multiplexer的指针
&pSink); // 得到指向IFileSinkFilter接口的指针(可选的)
在指定了输出文件之后,调用ICaptureGraphBuilder2::RenderSteam方法将视频流数据传送给File Writer Filter,从而使采集的数据可以存储到文件中。
要建立一个同时进行预览和采集的Graph,只需按照上面的方法连续两次调用ICaptureGraphBuilder2::RenderStream。在一些视频采集设备提供的驱动程序中,设备的WDM Capture Filter可能只提供了一个采集接口,如果希望在采集的同时可以观看到采集的图像,需要加入一个Smart Tee Filter,它将采集接口的视频流同步复制为两个独立的视频流,从而可以同时预览和采集数据。
2.6 眼前节图像的抓取
要利用DirectShow实现眼前节图像的抓取,有许多方法:
(1)最简单的方法是直接抓屏或是使用DirectX中的Media Detector(MediaDet)对象。但直接抓屏所得的图像容易受到屏幕上其他程序的影响;而MediaDet在应用上缺乏一定的灵活性。
(2)使用IBasicVideo::GetCurrentImage接口方法:
HRESULT GetCurrentImage(
long *pBufferSize, //缓冲区大小
long *pDIBImage //指向存储DIB格式图像缓冲区的指针
);
如果使用传统的Video Render,那么使用GetCurrentImage方法抓图将是不可靠的。因为如果Video Render使用DirectDraw加速,这个函数调用会失败;而且调用这个函数时,Video Render必须处于暂停状态。但如果我们使用的是VMR-9,则没有上述这些限制。
(3)最为复杂的方法是使用Sample Grabber Filter,这也是我们在系统中所采用的方法。与Media Detector相比,Sample Grabber更具有灵活性,因为它可以与所有的媒体类型协同工作,并且提供给开发人员更多的可编程性和控制能力。具体步骤如下:
1)创建Sample Grabber,并将其加入到Filter Graph中。
2)给Sample Grabber设置Pin上连接用的媒体类型以及回调函数。
3)将其与期望捕获数据的Filter相连接,完成Filter Graph的构建。
当有数据帧通过Sample Grabber时,就可利用回调函数获取抓到的Sample数据。然后通过GDI+ 将图像以指定的格式保存到磁盘上。
2.7 程序架构
因为程序的其他组成部分是采用MFC在VC 6.0下开发,为了使DirectShow与MFC Framework的Document/View结构协调工作,也为了更好的进行代码复用,我们将与DirectShow视频相关的部分封装成一个类:CDxVideoGraphBase,它封装了用于建立和控制一个进行视频采集和回放的Filter Graph的方法。通过继承CDxVideoGraphBase,可以使基于MFC的程序轻松实现视频采集的功能。类的继承图如下,其中ISampleGrabberCB为用于捕捉静态图像的Sample Grabber的回调函数的接口:
图3 类继承图
Fig.3 The class inheritance diagram
另外在采集卡支持多路输入的情况下,为了选择期望的输入,我们将与输入选择和IAMCros***ar 相关的功能封装进CCros***ar和CRouting这两个类。
3 小 结
随着视频采集设备(包括采集卡,摄像头,电视卡,DV等)价格的降低,其在现实生活中的应用越来越广泛。相对于采用厂商提供的SDK开发包,采用DirectShow技术具有更广泛的通用性。它不仅能够适合用户不同的硬件环境,而且便于数据的进一步处理应用。本文对DirectShow视频捕捉架构的功能特点、基本结构和眼前节图像采集系统的实现方法等方面进行了一定深度的分析。现在,我们已经把DirectShow技术运用于眼前节图像采集与分析系统,在实际应用中DirectShow体现出很好的易用性和高效性。该系统可以辅助眼科医师进行病理诊断,使得医师可以有时间对图像进行细致的分析,从而提高病理诊断的正确率。经实际测试,效果较为理想。
参考文献
[1] 谢杰镇、王博亮、徐昉等. 眼前节图像采集与归档[A]. 2001年全国生物医学电子学、测量、信息与控制和传感器联合学术年会[C]. 武汉:华中科技大学出版社. 2001. 103-104
[2] 谢杰镇. 眼前节图像采集、分析、归档系统的研究与实现[D].厦门:厦门大学计算机科学系.2002
[3] Microsoft Corporation. Windows DDK Documentation[M/CD]. http://msdn.microsoft.com/library/en-us/ddkint/hh/ddkint/ddksplash_0d0ef7c0-7411-4fed-8c52-ef4690fe6e40.xml.asp. 2004
[4] Microsoft Corporation. DirectX 9.0 Documentation for C++[M/CD]. http://msdn.microsoft.com/library/en-us/directshow/htm/directshow.asp. 2003The Design of Anterior Segment Image Capturing System Using DirectShow
CHEN Yu, WANG Bo-liang*, XIE Jie-zhen
(Department of Computer Science, Xiamen University, Xiamen, 361005, China )
Abstract: Observing anterior segment via slit lamp microscope is a common measure in ophthalmological diagnoses. However, this method has its inherent problem regarding to the difficulty of its data acquisition, storing and sharing. In this paper, a new design of anterior segment image capturing system based on DirectShow, which is a new standard media-streaming architecture for Windows platform, was presented. The building of Filter Graph model, which was the focus of the paper, included mainly three parts: the selection strategy of capture device, the preview and capture of video stream, and capturing anterior segment images by Sample Grabber method. A new method was proposed to the combination of DirectShow and MFC. With the help of this system, ophthalmologists can fix attention on in-depth analysis, and, as a result, the veracity of diagnosis can be increased. According to ophthalmologists, this system shows good results in clinic practice.
Key word: DirectShow; Image Capture; Anterior Segment Image
0