GigEVision接口摄像机及其应用摘要:GigEVision接口技术成为了机器视觉工业的一项非常具有吸引力的技术,Baslerscout系列GigEVision摄像机具有卓越的性能,Basler提供了Pylon驱动包开发包,可方便用户二次开发。将该摄像机应用于10m水位试验台铟钢尺图像获取并在计算机上显示。关键词:GigEVision;摄像机;PylonAPI;图像显示和缩放水位试验台(简称水位台)是对水位计进行检定的实验装置,它的参考标准是具有很低膨胀系数的铟钢尺,而10m水位试验台的铟钢尺高达10多米,必须通过摄像机跟踪水位摄取铟钢尺水位图像在计算机上显示才能读取标准水位值。本文选用了Basler公司机器视觉专用Scout系列以太网接口摄像机,该相机支持GigEVision机器视觉的标准接口。1GigEVision标准和Pylon驱动包1.1GigEVision标准目前工业摄像机接口有火线1394、GigEVision、Camera-Link、USB等几种。火线1394接口为了延长通信距离,使用Repeater或者Hub通信距离只能达到72m,不仅增加了功耗和使用的电缆的条数,还增加了遭受电磁干扰的可能。Camera-Link和USB最长通信距离只有30m,而GigEVision接口在不使用Repeater和Hub情况下通信距离就可达100m。GigEVision标准由自动化图像协会AIA(AutomatedImagingAssociation)委员会定义,委员会包括BaslerAG和视觉工业领域的主要公司,目标是定义基于以太网的应用于机器视觉的标准接口,让相机和软件无缝连接。GigEVision标准由4个主要部分组成[1]:(1)定义了让应用程序发现和枚举设备的机制,定义了设备如何获得一个有效的IP地址;(2)定义了GigEVision控制协议(GVCP),允许对被发现的设备进行配置,保证传输的可靠性;(3)定义了GigEVision流协议(GVSP),允许应用程序接收发自设备的信息;(4)定义了bootstrap寄存器,描述了设备自身,如当前IP地址、序列号、制造商信息等。可以借用TCP/IP的结构来描述GigEVision的结构,但TCP/IP用于机器视觉性能是不够的。GigEVision标准是基于UDP协议的,UDP使用端口允许应用程序之间的连接,虽然UDP不如TCP可靠,但增加了性能,特别适用于机器视觉中的高速图像传输。为了克服UDP的不可靠,GigEVision引入了两个额外的协议:(1)GVCP协议。该协议依赖于UDP的应用层协议,将保证图像传输的可靠性机制引入到UDP中,允许设备配置1个或多个信道的实例化。控制信道分为主次信道,主信道由主应用产生,允许对设备读写寄存器;次信道由次应用产生,允许应用只读寄存器。(2)GVSP协议。该协议建立在UDP传输层上的应用层协议,应用接收图像数据、图像信息和其他信息,数据包总是由设备发送给应用程序,GVSP提供了保证包传输可靠性的机制和让流控最少化的机制。OSI模型和GigEVision结构。BaslerScout系列以太网接口摄像机应用了高质量的SonyCCD传感器,支持从VGA到200万像素的分辨率和具有体积小设计牢靠的特点,能够方便地集成到用户的机器视觉系统。使用Gigabit以太网带宽可获得最高70帧/s的速度。使用CAT6电缆,经过测试图像传送距离可达100m。1.2BaslerPylon驱动包Pylon驱动包(PylonDriverPackage)是为所有的具有FireWire和GigE接口的Basler相机设计的,可以选择最适合应用的接口技术或者两者同时使用。Pylon驱动提供可靠实时的图像数据传输到PC存储器而只需要很低的CPU负担。Pylon开发包结构图。Pylon内部结构基于GenICam技术,PylonAPI2.1支持GenIcam标准的1.1版本,它提供了很简单的访问新的摄像机模型的方法。GenICam的核心是用XML描述文件对相机属性的描述。使用该文件,解释器能直接产生叫做GenAPI的C++应用程序接口(API)和图形用户接口(GUI)的元件。这使得用户可方便地鉴别相机类型以及详细的特性和所支持的功能以及功能参数。PylonGigEVision驱动快速地把图像数据从网络上的数据中分离开,使得应用程序能用很低的CPU负担获得可用的图像数据,驱动只能用于有特定Intel芯片的网卡。PylonGigEVision滤波器驱动支持各种硬件、GigE网卡和主板上的GigE端口。利用最新的驱动栈技术,Basler增加了服务质量(QoS)超过了微软(Microsoft)的标准。PylonViewer软件提供了方便的测试评估Basler相机的应用程序。2使用Pylon驱动包本文采用的是Pylon2.1版本的开发包,使用MSVisualStudio2003或者2005进行应用程序的开发,在开发之前要做以下准备工作:(1)包含路径在编译器中添加以下两个路径:$(PYLON_ROOT)\include$(PYLON_ROOT)\..\genicam\library\cpp\include(2)库路径和库文件#include<pylon/PylonIncludes.h>该文件包含了必须的#pragmacommentlib语句。在连接器搜索路径中添加以下路径以找到.lib文件:$(PYLON_ROOT)\lib\win32$(PYLON_ROOT)\..\genicam\library\CPP\Lib\WIn32_i86(3)设置环境变量Pylon开发包安装过程中设置了以下的环境变量:PYLON_ROOT:用于定位TransportLayer库;GENICAM_ROOT_V1_1:用户定位GenApiNodeMaps所在库;GENICAM_CACHE:描述了GenApi的XML文件缓存的位置。3应用程序开发本次使用的相机型号是scA640-74gm/gc,分辨率为659×494。采用基于对话框的MFC应用程序开发,主要完成图像的显示和缩放。Pylon提供了TransportLayer作为物理接口的抽象,它有访问相机设备的驱动。TransportLayer提供以下功能[2]:(1)设备发现;(2)读写相机寄存器;(3)抓取图像;(4)配置传输层;(5)创建Camera对象;(6)删除Camera对象。TransportLayer对象用于:(1)枚举Camera设备;(2)创建Camera对象;(3)访问TransportLayer参数。枚举可用的TransportLayer和创建TransportLayer对象由Pylon::CTlFactory类完成。为了方便起见,也提供枚举所有多个TransportLayer上可用的相机的方法和不需要TransportLayer对象创建相机设备的方法。Pylon中物理相机设备由Camera对象代表。Camera对象由TransportLayer对象或者Pylon::CTlFactory类创建。为了从数据流中抓取图像,需要流抓取器对象。流抓取器对象由Camera对象管理。获取图像和显示的流程。3.1相机设置(1)设置相机的感兴趣区域(AOI)设置相机分辨率为最大;(2)关闭触发,采用连续捕获;(3)设置自动曝光以适应不同强度的光线。代码参考如下[3]:m_pCamera=m_pTlFactory->CreateDevice(m_devices[m_ixCamera]);//创建Camera对象m_pStreamGrabber=m_pCamera->GetStreamGrabber(0);//创建图像抓取器m_pCamera->Open();//打开Camera对象m_pStreamGrabber->Open();//打开图像抓取器m_pCameraNodeMap=m_pCamera->GetNodeMap();//获取Camera节点图//SetAOICIntegerPtrptrOffsetX=m_pCameraNodeMap->GetNode("OffsetX");//获取X方向偏移节点CIntegerPtrptrOffsetY=m_pCameraNodeMap->GetNode("OffsetY");//获取Y方向偏移节点CIntegerPtrptrAoiWidth=m_pCameraNodeMap->GetNode("Width");//获取宽度节点CIntegerPtrptrAoiHeight=m_pCameraNodeMap->GetNode("Height");//获取高度节点m_AoiSize.cx=(ptrAoiWidth->GetMax());//图像最大宽度m_AoiSize.cy=(ptrAoiHeight->GetMax());//图像最大高度m_AoiSize.cx=m_AoiSize.cx&~3;ptrOffsetX->SetValue(0);//X偏移设置为0ptrOffsetY->SetValue(0);//Y偏移设置为0ptrAoiWidth->SetValue(m_AoiSize.cx);//图像宽度设置ptrAoiHeight->SetValue(m_AoiSize.cy);//图像高度设置CEnumerationPtrptrTriggerSelector=m_pCameraNodeMap->GetNode("TriggerSelector");ptrTriggerSelector->FromString("AcquisitionStart");CEnumerationPtrptrTriggerMode=m_pCameraNodeMap->GetNode("TriggerMode");ptrTriggerMode->FromString("Off");CEnumerationPtrptrAcquisitionMode=m_pCameraNodeMap->GetNode("AcquisitionMode");ptrAcquisitionMode->FromString("Continuous");CEnumerationPtrptrExposureMode=m_pCameraNodeMap->GetNode("ExposureMode");ptrExposureMode->FromString("Timed");CEnumerationPtrptrExposureAuto=m_pCameraNodeMap->GetNode("ExposureAuto");ptrExposureAuto->FromString("Continuous");3.2获取图像数据的流程获取图像的流程。3.3显示图像与缩放从摄像机获得的图像是YUV格式的,首先要将YUV信号转换为RGB信号,可调用Pylon驱动包提供的YUV信号转RGB的函数[2]。在VC.Net中调用CreatCompatibleDC创建一个内存设备上下文.SelectObject函数,将与设备无关的位图选入内存设备上下文中;然后调用BitBlt函数在内存设备上下文和屏幕设备上下文中进行位图考贝,实现图像显示[4]。要实现图像的缩放就要进行图像插值,采用了最邻近插值算法[4]。所设计的程序界面。本文应用Pylon开发包进行应用程序开发,实现了铟钢尺图像在PC上的显示,图像显示清晰,满