花再军,黄凤辰,陈 钊
(河海大学 计算机与信息学院,江苏 南京 210098)
水位试验台(简称水位台)是对水位计进行检定的实验装置,它的参考标准是具有很低膨胀系数的铟钢尺,而10 m水位试验台的铟钢尺高达10多米,必须通过摄像机跟踪水位摄取铟钢尺水位图像在计算机上显示才能读取标准水位值。本文选用了Basler公司机器视觉专用Scout系列以太网接口摄像机,该相机支持GigE Vision机器视觉的标准接口。
目前工业摄像机接口有火线 1394、GigE Vision、Camera-Link、USB等几种。火线1394接口为了延长通信距离,使用Repeater或者Hub通信距离只能达到72 m,不仅增加了功耗和使用的电缆的条数,还增加了遭受电磁干扰的可能。Camera-Link和USB最长通信距离只有30 m,而GigE Vision接口在不使用Repeater和Hub情况下通信距离就可达100 m。GigE Vision标准由自动化图像协会AIA(Automated Imaging Association)委员会定义,委员会包括Basler AG和视觉工业领域的主要公司,目标是定义基于以太网的应用于机器视觉的标准接口,让相机和软件无缝连接。GigE Vision标准由4个主要部分组成[1]:
(1)定义了让应用程序发现和枚举设备的机制,定义了设备如何获得一个有效的IP地址;
(2)定义了 GigE Vision控制协议(GVCP),允许对被发现的设备进行配置,保证传输的可靠性;
(3)定义了 GigE Vision流协议(GVSP),允许应用程序接收发自设备的信息;
(4)定义了 bootstrap寄存器,描述了设备自身,如当前IP地址、序列号、制造商信息等。
可以借用TCP/IP的结构来描述GigE Vision的结构,但TCP/IP用于机器视觉性能是不够的。GigE Vision标准是基于UDP协议的,UDP使用端口允许应用程序之间的连接,虽然UDP不如TCP可靠,但增加了性能,特别适用于机器视觉中的高速图像传输。为了克服UDP的不可靠,GigE Vision引入了两个额外的协议:(1)GVCP协议。该协议依赖于UDP的应用层协议,将保证图像传输的可靠性机制引入到UDP中,允许设备配置1个或多个信道的实例化。控制信道分为主次信道,主信道由主应用产生,允许对设备读写寄存器;次信道由次应用产生,允许应用只读寄存器。(2)GVSP协议。该协议建立在UDP传输层上的应用层协议,应用接收图像数据、图像信息和其他信息,数据包总是由设备发送给应用程序,GVSP提供了保证包传输可靠性的机制和让流控最少化的机制。OSI模型和GigE Vision结构如图1所示。
图1 OSI模型和GigE Vision结构
Basler Scout系列以太网接口摄像机应用了高质量的Sony CCD传感器,支持从VGA到200万像素的分辨率和具有体积小设计牢靠的特点,能够方便地集成到用户的机器视觉系统。使用Gigabit以太网带宽可获得最高70帧/s的速度。使用CAT6电缆,经过测试图像传送距离可达100 m。
Pylon驱动包(Pylon Driver Package)是为所有的具有FireWire和GigE接口的Basler相机设计的,可以选择最适合应用的接口技术或者两者同时使用。Pylon驱动提供可靠实时的图像数据传输到PC存储器而只需要很低的CPU负担。Pylon开发包结构图如图2所示。
图2 Pylon开发包的结构
Pylon内部结构基于GenICam技术,Pylon API 2.1支持GenIcam标准的1.1版本,它提供了很简单的访问新的摄像机模型的方法。GenICam的核心是用XML描述文件对相机属性的描述。使用该文件,解释器能直接产生叫做GenAPI的C++应用程序接口(API)和图形用户接口(GUI)的元件。这使得用户可方便地鉴别相机类型以及详细的特性和所支持的功能以及功能参数。
Pylon GigE Vision驱动快速地把图像数据从网络上的数据中分离开,使得应用程序能用很低的CPU负担获得可用的图像数据,驱动只能用于有特定Intel芯片的网卡。Pylon GigE Vision滤波器驱动支持各种硬件、GigE网卡和主板上的GigE端口。利用最新的驱动栈技术,Basler增加了服务质量(QoS)超过了微软(Microsoft)的标准。Pylon Viewer软件提供了方便的测试评估Basler相机的应用程序。
本文采用的是Pylon2.1版本的开发包,使用MS Visual Studio 2003或者2005进行应用程序的开发,在开发之前要做以下准备工作:
(1)包含路径
在编译器中添加以下两个路径:
$(PYLON_ROOT)include
$(PYLON_ROOT)..genicamlibrarycppinclude
(2)库路径和库文件
#include
该文件包含了必须的#pragma comment lib语句。
在连接器搜索路径中添加以下路径以找到.lib文件:
$(PYLON_ROOT)libwin32
$(PYLON_ROOT)..genicamlibraryCPPLibWIn32_i86
(3)设置环境变量
Pylon开发包安装过程中设置了以下的环境变量:
PYLON_ROOT:用于定位 Transport Layer库;
我是2005年开始使用班级QQ聊天群的。起初,QQ还未广泛使用,班级群的作用仅是个别家长与老师的交流平台,平时也不需要怎么管理,对于家长们的发言,也能够做到及时回复,及时反馈。
GENICAM_ROOT_V1_1:用户定位GenApiNodeMaps所在库;
GENICAM_CACHE:描述了GenApi的XML文件缓存的位置。
本次使用的相机型号是scA640-74gm/gc,分辨率为659×494。采用基于对话框的MFC应用程序开发,主要完成图像的显示和缩放。
Pylon提供了Transport Layer作为物理接口的抽象,它有访问相机设备的驱动。Transport Layer提供以下功能[2]:(1)设备发现;(2)读写相机寄存器;(3)抓取图像;(4)配置传输层;(5)创建 Camera对象;(6)删除 Camera对象。
Transport Layer对象用于:(1)枚举Camera设备;(2)创建Camera对象;(3)访问Transport Layer参数。枚举可用的TransportLayer和创建TransportLayer对象由Pylon::CTlFactory类完成。为了方便起见,也提供枚举所有多个Transport Layer上可用的相机的方法和不需要Transport Layer对象创建相机设备的方法。Pylon中物理相机设备由Camera对象代表。Camera对象由Transport Layer对象或者Pylon::CTlFactory类创建。为了从数据流中抓取图像,需要流抓取器对象。流抓取器对象由Camera对象管理。获取图像和显示的流程如图3所示。
图3 获取图像和显示的流程
(1)设置相机的感兴趣区域(AOI)设置相机分辨率为最大;
(2)关闭触发,采用连续捕获;
代码参考如下[3]:
获取图像的流程如图4所示。
图4 获取图像的流程
从摄像机获得的图像是YUV格式的,首先要将YUV信号转换为RGB信号,可调用Pylon驱动包提供的YUV信号转RGB的函数[2]。在VC.Net中调用CreatCompatibleDC创建一个内存设备上下文.SelectObject函数,将与设备无关的位图选入内存设备上下文中;然后调用BitBlt函数在内存设备上下文和屏幕设备上下文中进行位图考贝,实现图像显示[4]。
要实现图像的缩放就要进行图像插值,采用了最邻近插值算法[4]。
所设计的程序界面如图5所示。
图5 应用程序界面
本文应用Pylon开发包进行应用程序开发,实现了铟钢尺图像在PC上的显示,图像显示清晰,满足应用要求。
[1]Basler vision technologies.The Elements of GigE Vision[DB/OL].http://www.baslerweb.com.
[2]Basler vision technologies. Pylon for Windows API Reference and Programmer′s Guide v2.1[DB/OL].http://www.baslerweb.com.
[3]何斌,马天宇.Visual C++数字图像处理[M].北京:人民邮电出版社,2001.