基于DirectShow技术船用钢板图像采集设计与实现

2014-03-20 04:45汤芳利
关键词:枚举预览应用程序

王 直,汤芳利

(江苏科技大学计算机科学与工程学院,江苏镇江212003)

随着科技的发展和工业制造水平的提高,现代工业特别是航空航天、造船、汽车、石油及天然气储运、大型机械加工、涡轮机、发电机等领域,需要对大型结构外部尺寸进行精密三维测量,人工目测方法已远远不能满足对质量管理的需求.随着机器视觉技术的发展以及现有计算机等技术具有的强大的数据处理能力,这为大尺寸工件的工业测量提供了技术保障.目前图像采集方式包括与硬件相关的SDK开发,及与硬件无关的WIA和TWAIN[1]等方式.SDK开发比较普遍,但是针对特定的输入设备,需要重新进行开发;TWAIN协议是各种视频采集硬件和处理软件的通信协议和编程接口标准,但是生产厂商支持的较少或者设备固件提供的能实现功能有限,局限性较大;WIA[2]是微软系统下的图像采集协议,采用该协议能实现对数字图像设备的图像采集,但是无法实现实时预览.而Direct-Show技术,不但能很好地回避采集设备硬件复杂性,方便地从采集卡上捕获数据,并且可以进行相应的后期处理乃至存储到文件中.文中基于Direct-Show技术的图像采集系统是在对船用钢板实时监控的基础上,通过对DirectShow技术特点的研究,提出一种大尺寸工件的图像采集系统方案.

1 DirectShow技术

DirectShow是由微软公司开发的能够让软件开发者对媒体文件执行各种不同处理的应用程序设计接口,为在Windows平台上处理各种格式的媒体文件的回放、音视频采集等高性能要求的多媒体应用,提供了完整的解决方案[3].

DirectShow基于微软公司Windows组件对象模型(COM)框架,DirectShow为大部份微软公司程序设计语言提供了一个媒体的普遍接口,是以Filter为基础的框架.文中利用它回避不可预知的硬件平台这一优势,实现USB摄像头的图像采集.DirectShow的系统概述如图1[3].

图1 DirectShow的系统Fig.1 DirectShow system overview

图1中的过滤器图在Windows注册中寻找注册了的Filter,并且为这些Filter创建本地提供的Graph,在这之后,它将所有的Filter连接在一起,并且由开发者来控制播放或者中止Graph,以实现不同应用功能.

Filter是DirectShow中最基本的概念,也是Filter Graph中的最小功能模块,Filter之间通过PIN相互链接,根据实现功能不同可以分为3类,分别是Source Filter,Transform Filter和Rendering Filter,可以根据每个Filter的PIN来区别,Source Filter只有输出PIN,Transform Filter既有输入也有输出PIN,Rendering Filter只有输入PIN.Filter是一种COM组件,每个Filter上都至少实现了控制该Filter功能的IBaseFilter接口[3].

2 系统总体设计

本系统应用于测量的目标船用钢板规格是12m ×8m×3m,要准确取得钢板的长宽高数据,可以通过摄像头1和2采集到钢板的正视图,通过摄像头3采集到钢板的侧视图,将采集到的数据存储或传输到计算机控制中心,进行图像处理.对于摄像头角度的控制则是通过三角支架来调整的,应用环境整体布局如图2.

图2 应用现场示意图Fig.2 Application's environment layout

选择DirectShow技术在于它不但屏蔽了硬件的不可预知性,而且采集的图像是属于BMP格式,这种格式的特点是包含的图像信息较丰富,这对于后续的图像处理是一种优势.

图3是该系统的总体设计.

图3 系统总体设计Fig.3 Structure of the system

1)Filter模块

根据GraphEdit工具设计的链路,在该模块实现功能包括源过滤图、SmartTee过滤图、AVIMux过滤器、File Writer过滤器、SampleGrabber过滤器、MJPEG Compressor过滤器以及Video Render过滤器的创建,Filter Graph的创建,所有Filter接口定义,这些都需要操作一类COM对象来完成(图4).

图4 FilterFig.4 Filter

2 )设备源选择模块

设备源选择模块主要功能是定义系统设备枚举器接口,搜索枚举系统中已注册视频设备,实现源设备的搜索与枚举,并显示到界面设备选择列表框(图5).最后定义了设备选择功能,将选定设备绑定到源Filter,实现摄像头与PC机的连接.

图5 设备源选择Fig.5 Source selection

3 )图像信号控制模块

图像信号控制模块主要功能是控制两路Filter Graph链路的工作状态,分别是预览链路和图像采集链路,通过各个Filter PIN的接口来控制各个Filter功能,完成链路开启以及关闭图像预览,信号源的开始与结束等(图6).

图6 图像信号控制Fig.6 Image signal control

4 )图像采集模块

图像采集模块主要由自定义类CSampleGrabberCB实现,完成对关键的抓图Filter的功能设置,以及图像属性的查看,最终实现图像的采集以及存储(图7).

图7 图像采集Fig.7 Image acquisition

3 图像采集应用程序实现

3.1 采集设备Filter的构建

采集设备的种类很多,按照接口方式可以分为PCI设备、AGP设备、USB设备、1394设备等.而按照驱动模型可以分为WDM设备、VFW设备.WDM支持多种特性,比如直接支持电视接收、视频会议、1394接口的设备、桌面摄像机、多条视频流的同时输出等.

DirectShow使用WDM video Capture Filter来支持WDM卡,使用另一个VFW Capture Filter来支持VFW卡.这两种驱动模型的采集卡都以Filter形式注册为CLSIDVideolnputDeviceCategory类型,它们都要靠系统设备枚举来创建.

在DirectShow的框架下,DirectShow通过特殊的包装Filter对采集设备进行了包装,只要采集设备正确安装,DirectShow就能把它包装成一个Filter,并且在一定的目录下注册,换句话说,应用程序只要枚举特定的类型目录,就能知道系统中安装了多少个什么类型的采集设备.DirectShow定义了很多类型的目录供不同的Filter注册.

本系统采集设备的创建分为如下几步[4]:

1 )使用 CoCreateInstance函数创建枚举组(CLSIDSystemDeviceEnum)对象.

2 )用 ICreateDevEnum::CreateClassEnumerator为指定的Filter注册类型目录创建一个枚举器,并获得IEnumMoniker接口.

3 )使用IEnumMoniker接口方法枚举指定类型目录下的所有设备标识(Device Moniker).

4 )用IMoniker::BindTOStorage后,可以访问设备标识的属性集,如DisplayName,FriendlyName.

5 )调用IMoniker::BindToObject可以将设备标识成一个Source Filter.

3.2 Filter graph结构设计

文中采集设备是只有一个Capture输出PIN,主要用于图像数据的采集.为了能实时预览画面,添加Smart Tee Filter用于预览和采集的分路,其中Sample Grabber是一个传输Filter用于抓取图片,构建的Filter Graph如图8.

图8 Filter图Fig.8 Filter graph

3.3 系统流程设计

DirectShow通过Filter与各式各样的设备,包括本地文件系统、TV调谐器、视频采集卡、编解码器、显示器、声卡等进行通信.因此DirectShow将应用程序与设备之间的多样性和复杂性隔离开[5].

系统实时预览流程见图9,图像采集流程见图10.

图9 实时预览流程Fig.9 Flow chart of real-time preview

3.4 系统实现图像采集的关键原理

由于Filter是基于COM机制实现的,对于各个Filter的创建,需要掌握一些基本的COM编程知识,在Visual C++中创建COM对象,程序部分代码如下:

图10 图像采集流程Fig.1 0 Flow chart of image acquisition

由于DirectShow采集进来的图像是BMP格式,文中采用的是缓冲区模式从实时源中抓取图像,它采用回调函数的形式将数据帧传递给应用程序[5].从摄像头中获取数据帧最常见的办法是利用Sample Grabber Filter来完成,由于视频流中的每一帧数据都会经过Filter,只要让Filter通过回调机制通告上层应用程序进行对当前数据帧进行处理便可实现图像采集.但这种方式需要采用回调函数形式将数据传递给应用程序,而回调函数是从Directshow的SDK包含的ISampleGrabberCB类中派生出自己的类,然后实现其虚函数.

文中的CSampleGrabberCB类就是定义为一个响应图像采集的回调函数[6],它是ISampleGrabber-CB的派生类,通过实现该类的虚函数,来完成图像的数据采集和存储功能,实现回调函数的一个实例,实现关键代码如下:

所有的工作都在BufferCB函数里完成,当有一个新的数据帧到来的时候,这个函数就会被Sample Grabber调用到.

关键代码如下所示:

文中图像格式数据结构的定义,使用到的结构体是BITMAPINFOHEADER.

4 实现结果

4.1 设备搜索

通过搜索可选设备按钮后,当前系统可选设备名称将显示在设备可选列表框,选择设备后,点击选定设备(图11).

图11 设备选择Fig.1 1 Device selected

4.2 图像预览

软件能简单高效的实现实时预览,系统忽略硬件的复杂性,将输入设备统一封装成并注册成Source Filter,显示结果如图12.

图12 图像预览Fig.1 2 Image preview

4.3 图像采集

通过配置并实现捕捉图像的Grabber Filter,成功实现实时监控数据流中抓取图像帧.系统采集到信息丰富的BMP格式图像,有利于后续的图像处理,通过拍照按钮,进行抓图,先点击浏览按钮,选择图像存储目标路径后,再点击拍照,便可将图像采集到目标文件夹中,这是利用了DirectShow技术,对于支持自定义功能的Filter来实现的.保存路径设置如图13,图像采集结果如图14.

图13 选择存储路径Fig.1 3 Select storage path

图14 图像采集Fig.1 4 Image acqusition

4.4 图像属性显示

点击照片属性,可以查看采集到的照片的相关信息,此外,系统预留有录制视频和结束视频按钮,本系统通过控制支架来移动摄像头,将船用钢板录制成视频文件,通过网络传输到远程控制计算机中心,记录现场环境情况,便于后期处理分析备用.界面显示如图15[78].

图15 图像属性Fig.1 5 Image property

5 结论

文中采用摄像头是1 080P格式的高清摄像头,同步采集图像信息,实验中实现了基于DirectShow图像预览和抓图,基于DirectShow的单帧图像抓取功能已经实现,效果良好,可以很好地实现抓图的功能,界面友好,摄像头的位置和参数符合图像采集的要求.不足的一点是,对于采集设备的参数设置不够灵活,在采集实现过程中,发现数据会延时.由采集到的图像属性信息可知,采集到的图像并不是很大,这样对于后期图像的Matlab算法处理,图像矩阵数据不至于太庞大,同样的算法下,能够加快处理速度,而且该程序对于Windows系统能识别的摄像头均适用.结果表明,在图像分辨率并不是特别高要求的场合下,该系统能实现现场的实时监控和图像采集.

References)

[1] TWAIN Specification Version 2.2[CP/OL].[20131110].http:∥www.twain.org/,2012.

[2] Microsoft Corporation.Microsoft software MSDN[EB/ OL].http:∥msdn Microsoft.com.2013.

[3] 陆其明.DirectShow开发指南[M].北京:清华大学出版社,2003:151,127152.

[4] Microsoft Corporation.DirectX 9.0 SDK MSDN[EB/ OL].http:∥msdn Microsoft.com.2013.

[5] Mark D P.The programming Microsoft DirectShow for digital video and TV[M].Washington:Microsoft Press.2003,4.

[6] 朱尹华,周尚波,王兴星,等.基于DirectShow视频帧实时捕捉的设计与实现[J].计算机应用与软件,2011,28(1):3738.

Zhu Yinhua,Zhou Shangbo,Wang Xingxing,et al.Designing and implementing real-time video frame capturing based on DirectShow[J].Computer Science and Software,2011,28(1):3738.(in Chinese)

[7] Ivor Horton.C++入门经典[M].3版.李予敏,译.北京:清华大学出版社,2006:536578.

[8] George Shepherd,Scot Wingo.深入浅析MFC[M].1版.赵剑云,董瑾,译.北京:中国电力出版社,2003: 149192,326377.

[9] 曲扬.Visual C++实效编程280例[M].北京:人民邮电出版社,2009:111164.

[10] 孟月华,邓基园.DirectShow技术的应用研究与开发[J].计算机系统应用,2013,22(6):198.

Meng Yuehua,Deng Jiyuan.Application and development of DirectShow technology[J].Computer Systems&Applications,2013,22(6):198.(in Chinese)

猜你喜欢
枚举预览应用程序
基于理解性教学的信息技术教学案例研究
一种高效的概率图上Top-K极大团枚举算法
新品预览
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
11月在拍电视剧预览表
基于太阳影子定位枚举法模型的研究
bauma China 2014展前预览
USB开发中易混淆的概念剖析
三星电子将开设应用程序下载商店