《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > GigE Vision接口攝像機(jī)及其應(yīng)用
GigE Vision接口攝像機(jī)及其應(yīng)用
來源:微型機(jī)與應(yīng)用2011年第21期
花再軍,黃鳳辰,陳 釗
(河海大學(xué) 計算機(jī)與信息學(xué)院,江蘇 南京 210098)
摘要: GigE Vision接口技術(shù)成為了機(jī)器視覺工業(yè)的一項非常具有吸引力的技術(shù),Basler scout系列GigE Vision攝像機(jī)具有卓越的性能, Basler提供了Pylon驅(qū)動包開發(fā)包,可方便用戶二次開發(fā)。將該攝像機(jī)應(yīng)用于10 m水位試驗臺銦鋼尺圖像獲取并在計算機(jī)上顯示。
Abstract:
Key words :

摘  要: GigE Vision接口技術(shù)成為了機(jī)器視覺工業(yè)的一項非常具有吸引力的技術(shù),Basler scout系列GigE Vision攝像機(jī)具有卓越的性能, Basler提供了Pylon驅(qū)動包開發(fā)包,可方便用戶二次開發(fā)。將該攝像機(jī)應(yīng)用于10 m水位試驗臺銦鋼尺圖像獲取并在計算機(jī)上顯示。
關(guān)鍵詞: GigE Vision;攝像機(jī);Pylon API;圖像顯示和縮放

 水位試驗臺(簡稱水位臺)是對水位計進(jìn)行檢定的實驗裝置,它的參考標(biāo)準(zhǔn)是具有很低膨脹系數(shù)的銦鋼尺,而10 m水位試驗臺的銦鋼尺高達(dá)10多米,必須通過攝像機(jī)跟蹤水位攝取銦鋼尺水位圖像在計算機(jī)上顯示才能讀取標(biāo)準(zhǔn)水位值。本文選用了Basler公司機(jī)器視覺專用Scout系列以太網(wǎng)接口攝像機(jī),該相機(jī)支持GigE Vision機(jī)器視覺的標(biāo)準(zhǔn)接口。
1 GigE Vision標(biāo)準(zhǔn)和Pylon驅(qū)動包
1.1 GigE Vision標(biāo)準(zhǔn)

 目前工業(yè)攝像機(jī)接口有火線1394、GigE Vision、Camera-Link、USB等幾種?;鹁€1394接口為了延長通信距離,使用Repeater或者Hub通信距離只能達(dá)到72 m,不僅增加了功耗和使用的電纜的條數(shù),還增加了遭受電磁干擾的可能。Camera-Link和USB最長通信距離只有30 m,而GigE Vision接口在不使用Repeater和Hub情況下通信距離就可達(dá)100 m。GigE Vision標(biāo)準(zhǔn)由自動化圖像協(xié)會AIA(Automated Imaging Association)委員會定義,委員會包括Basler AG和視覺工業(yè)領(lǐng)域的主要公司,目標(biāo)是定義基于以太網(wǎng)的應(yīng)用于機(jī)器視覺的標(biāo)準(zhǔn)接口,讓相機(jī)和軟件無縫連接。GigE Vision標(biāo)準(zhǔn)由4個主要部分組成[1]:
 (1)定義了讓應(yīng)用程序發(fā)現(xiàn)和枚舉設(shè)備的機(jī)制,定義了設(shè)備如何獲得一個有效的IP地址;
 (2)定義了GigE Vision控制協(xié)議(GVCP),允許對被發(fā)現(xiàn)的設(shè)備進(jìn)行配置,保證傳輸?shù)目煽啃裕?br />  (3)定義了GigE Vision流協(xié)議(GVSP),允許應(yīng)用程序接收發(fā)自設(shè)備的信息;
 (4)定義了bootstrap寄存器,描述了設(shè)備自身,如當(dāng)前IP地址、序列號、制造商信息等。
 可以借用TCP/IP的結(jié)構(gòu)來描述GigE Vision的結(jié)構(gòu),但TCP/IP用于機(jī)器視覺性能是不夠的。GigE Vision標(biāo)準(zhǔn)是基于UDP協(xié)議的,UDP使用端口允許應(yīng)用程序之間的連接,雖然UDP不如TCP可靠,但增加了性能,特別適用于機(jī)器視覺中的高速圖像傳輸。為了克服UDP的不可靠,GigE Vision引入了兩個額外的協(xié)議: (1)GVCP協(xié)議。該協(xié)議依賴于UDP的應(yīng)用層協(xié)議,將保證圖像傳輸?shù)目煽啃詸C(jī)制引入到UDP中,允許設(shè)備配置1個或多個信道的實例化??刂菩诺婪譃橹鞔涡诺?,主信道由主應(yīng)用產(chǎn)生,允許對設(shè)備讀寫寄存器;次信道由次應(yīng)用產(chǎn)生,允許應(yīng)用只讀寄存器。(2)GVSP協(xié)議。該協(xié)議建立在UDP傳輸層上的應(yīng)用層協(xié)議,應(yīng)用接收圖像數(shù)據(jù)、圖像信息和其他信息,數(shù)據(jù)包總是由設(shè)備發(fā)送給應(yīng)用程序,GVSP提供了保證包傳輸可靠性的機(jī)制和讓流控最少化的機(jī)制。OSI模型和GigE Vision結(jié)構(gòu)如圖1所示。


 Basler Scout系列以太網(wǎng)接口攝像機(jī)應(yīng)用了高質(zhì)量的Sony CCD傳感器,支持從VGA到200萬像素的分辨率和具有體積小設(shè)計牢靠的特點,能夠方便地集成到用戶的機(jī)器視覺系統(tǒng)。使用Gigabit以太網(wǎng)帶寬可獲得最高70幀/s的速度。使用CAT6電纜,經(jīng)過測試圖像傳送距離可達(dá)100 m。
1.2 Basler Pylon驅(qū)動包
 Pylon驅(qū)動包(Pylon Driver Package)是為所有的具有FireWire和GigE接口的Basler相機(jī)設(shè)計的,可以選擇最適合應(yīng)用的接口技術(shù)或者兩者同時使用。Pylon驅(qū)動提供可靠實時的圖像數(shù)據(jù)傳輸?shù)絇C存儲器而只需要很低的CPU負(fù)擔(dān)。Pylon開發(fā)包結(jié)構(gòu)圖如圖2所示。

 Pylon內(nèi)部結(jié)構(gòu)基于GenICam技術(shù),Pylon API 2.1支持GenIcam標(biāo)準(zhǔn)的1.1版本,它提供了很簡單的訪問新的攝像機(jī)模型的方法。GenICam的核心是用XML描述文件對相機(jī)屬性的描述。使用該文件,解釋器能直接產(chǎn)生叫做GenAPI的C++應(yīng)用程序接口(API)和圖形用戶接口(GUI)的元件。這使得用戶可方便地鑒別相機(jī)類型以及詳細(xì)的特性和所支持的功能以及功能參數(shù)。
 Pylon GigE Vision驅(qū)動快速地把圖像數(shù)據(jù)從網(wǎng)絡(luò)上的數(shù)據(jù)中分離開,使得應(yīng)用程序能用很低的CPU負(fù)擔(dān)獲得可用的圖像數(shù)據(jù),驅(qū)動只能用于有特定Intel芯片的網(wǎng)卡。Pylon GigE Vision濾波器驅(qū)動支持各種硬件、GigE網(wǎng)卡和主板上的GigE端口。利用最新的驅(qū)動棧技術(shù),Basler增加了服務(wù)質(zhì)量(QoS)超過了微軟(Microsoft)的標(biāo)準(zhǔn)。Pylon Viewer軟件提供了方便的測試評估Basler相機(jī)的應(yīng)用程序。
2 使用Pylon驅(qū)動包

 


 本文采用的是Pylon2.1版本的開發(fā)包,使用MS Visual Studio 2003或者2005進(jìn)行應(yīng)用程序的開發(fā),在開發(fā)之前要做以下準(zhǔn)備工作:
 (1)包含路徑
 在編譯器中添加以下兩個路徑:
 $(PYLON_ROOT)\include
 $( PYLON_ROOT)\..\genicam\library\cpp\include
 (2)庫路徑和庫文件
 #include <pylon/PylonIncludes.h>
 該文件包含了必須的#pragma comment lib語句。
 在連接器搜索路徑中添加以下路徑以找到.lib文件:
 $(PYLON_ROOT)\lib\win32
 $(PYLON_ROOT)\..\genicam\library\CPP\Lib\WIn32_i86
 (3)設(shè)置環(huán)境變量
 Pylon開發(fā)包安裝過程中設(shè)置了以下的環(huán)境變量:
 PYLON_ROOT:用于定位Transport Layer庫;
 GENICAM_ROOT_V1_1: 用戶定位GenApi Node Maps所在庫;
 GENICAM_CACHE: 描述了GenApi的XML文件緩存的位置。
3 應(yīng)用程序開發(fā)
 本次使用的相機(jī)型號是scA640-74gm/gc,分辨率為659×494。采用基于對話框的MFC應(yīng)用程序開發(fā),主要完成圖像的顯示和縮放。
Pylon提供了Transport Layer作為物理接口的抽象,它有訪問相機(jī)設(shè)備的驅(qū)動。Transport Layer提供以下功能[2]:(1)設(shè)備發(fā)現(xiàn);(2)讀寫相機(jī)寄存器;(3)抓取圖像;(4)配置傳輸層;(5)創(chuàng)建Camera對象;(6)刪除Camera對象。
    Transport Layer對象用于:(1)枚舉Camera設(shè)備;(2)創(chuàng)建Camera對象;(3)訪問Transport Layer參數(shù)。枚舉可用的Transport Layer和創(chuàng)建Transport Layer對象由Pylon::CTlFactory類完成。為了方便起見,也提供枚舉所有多個Transport Layer上可用的相機(jī)的方法和不需要Transport Layer對象創(chuàng)建相機(jī)設(shè)備的方法。Pylon中物理相機(jī)設(shè)備由Camera對象代表。Camera對象由Transport Layer對象或者Pylon::CTlFactory類創(chuàng)建。為了從數(shù)據(jù)流中抓取圖像,需要流抓取器對象。流抓取器對象由Camera對象管理。獲取圖像和顯示的流程如圖3所示。


3.1 相機(jī)設(shè)置
 (1)設(shè)置相機(jī)的感興趣區(qū)域(AOI)設(shè)置相機(jī)分辨率為最大;
 (2)關(guān)閉觸發(fā),采用連續(xù)捕獲;
 (3)設(shè)置自動曝光以適應(yīng)不同強(qiáng)度的光線。
 代碼參考如下[3]:
m_pCamera = m_pTlFactory->CreateDevice (m_devices[m_ixCamera]);
//創(chuàng)建Camera對象
m_pStreamGrabber=m_pCamera->GetStreamGrabber(0);//創(chuàng)建圖像抓取器
m_pCamera->Open ();//打開Camera對象
m_pStreamGrabber->Open ();//打開圖像抓取器
m_pCameraNodeMap = m_pCamera->GetNodeMap();
//獲取Camera節(jié)點圖
//Set AOI
CIntegerPtr ptrOffsetX=m_pCameraNodeMap->GetNode("OffsetX");//獲取X方向偏移節(jié)點
CIntegerPtr ptrOffsetY=m_pCameraNodeMap->GetNode("OffsetY");//獲取Y方向偏移節(jié)點
CIntegerPtr ptrAoiWidth=m_pCameraNodeMap->GetNode ("Width");//獲取寬度節(jié)點
CIntegerPtr ptrAoiHeight=m_pCameraNodeMap->GetNode ("Height");//獲取高度節(jié)點
m_AoiSize.cx=(ptrAoiWidth->GetMax());
//圖像最大寬度
m_AoiSize.cy=(ptrAoiHeight->GetMax());
//圖像最大高度
m_AoiSize.cx=m_AoiSize.cx & ~3;
ptrOffsetX->SetValue(0);//X偏移設(shè)置為0
ptrOffsetY->SetValue(0);//Y偏移設(shè)置為0
ptrAoiWidth->SetValue(m_AoiSize.cx);//圖像寬度設(shè)置
ptrAoiHeight->SetValue(m_AoiSize.cy);//圖像高度設(shè)置
CEnumerationPtr ptrTriggerSelector=
 m_pCameraNodeMap->GetNode("TriggerSelector");
ptrTriggerSelector->FromString("AcquisitionStart");
CEnumerationPtr ptrTriggerMode=m_pCameraNodeMap->GetNode("TriggerMode");
ptrTriggerMode->FromString("Off");
CEnumerationPtr ptrAcquisitionMode=
m_pCameraNodeMap->GetNode("AcquisitionMode");
ptrAcquisitionMode->FromString("Continuous");
CEnumerationPtr ptrExposureMode=
m_pCameraNodeMap->GetNode("ExposureMode");
ptrExposureMode->FromString("Timed");
CEnumerationPtr ptrExposureAuto=
m_pCameraNodeMap->GetNode("ExposureAuto");
ptrExposureAuto->FromString("Continuous");
3.2 獲取圖像數(shù)據(jù)的流程
 獲取圖像的流程如圖4所示。

3.3 顯示圖像與縮放
 從攝像機(jī)獲得的圖像是YUV格式的,首先要將YUV信號轉(zhuǎn)換為RGB信號,可調(diào)用Pylon驅(qū)動包提供的YUV信號轉(zhuǎn)RGB的函數(shù)[2]。在VC.Net中調(diào)用CreatCompatibleDC創(chuàng)建一個內(nèi)存設(shè)備上下文.SelectObject函數(shù),將與設(shè)備無關(guān)的位圖選入內(nèi)存設(shè)備上下文中;然后調(diào)用BitBlt函數(shù)在內(nèi)存設(shè)備上下文和屏幕設(shè)備上下文中進(jìn)行位圖考貝,實現(xiàn)圖像顯示[4]。
 要實現(xiàn)圖像的縮放就要進(jìn)行圖像插值,采用了最鄰近插值算法[4]。
所設(shè)計的程序界面如圖5所示。

 本文應(yīng)用Pylon開發(fā)包進(jìn)行應(yīng)用程序開發(fā),實現(xiàn)了銦鋼尺圖像在PC上的顯示,圖像顯示清晰,滿足應(yīng)用要求。
參考文獻(xiàn)
[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++數(shù)字圖像處理[M].北京:人民郵電出版社,2001.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。