花再軍,黃鳳辰,陳 釗
(河海大學 計算機與信息學院,江蘇 南京 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.