完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基于DirectShow的眼前节图像采集系统的设计 陈 昱,王博亮*,谢杰镇
![]() 图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 |
|
相关推荐
5 个讨论
|
|
都需要什么器件呀?谁能帮我详细列出来,谢啦!
|
|
|
|
|
|
2352 浏览 2 评论
RK3588 HDMI in 接入设备如何获取HDMI in 传入的音频?
2754 浏览 1 评论
24612 浏览 1 评论
1329 浏览 0 评论
硬创大赛项目专访 | 田奕鑫:专注细分领域创新,我们和行业巨头“化敌为友”
94765 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-10 01:23 , Processed in 0.665848 second(s), Total 53, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191