引言
機器視覺,是指:“通過光學的裝置和非接觸的傳感器自動地接收和處理一個真實物體的圖像,以獲得所需信息或用于控制機器人運動的裝置。”[1] 在計算機技術和自動化控制技術迅速發展的今天,機器視覺技術日趨成熟,機器視覺產業作為新興產業,在醫療、工業控制、衛星通信等領域有著廣闊的應用前景。
目前工業用機器視覺產品主要根據工業照相機是否具有圖像處理功能而分為兩大類,一類稱為PC -Based(即由計算機中的軟件進行圖像處理工作),另一類稱為Smart –Camera(即照相機中集成了圖像處理芯片,可進行圖象處理工作)。
關于PC –Based產品,典型產品有諸如德國NeuroCheck公司 的NeuroCheck軟件,比利時Eurosys公司的eVision軟件,以及美國Cognex公司的 InSight 軟件等等。
以上各種圖像處理軟件都有各自的特點及優缺點,而利用軟件本身提供的插件編程接口,對其功能進行補充和完善,則可以使該軟件的功能得以更好地發揮。
一、NeuroCheck的主要功能及特點
NeuroCheck具有獨立的操作界面,使用時不需要依附任何其它的軟件,其風格簡單,容易上手。其界面風格可見于下圖:
圖1.1 NeuroCheck 的界面
它的主要功能有:
條形碼鑒別
矩形碼鑒別
存在性檢驗
特征量測量
定位
字符與模式識別
打印制量檢查
色彩處理
等等,涉及機器視覺工業應用的各個主要領域:
其特點就是已經將每個功能模塊做成獨立的函數,操作者只要在所應用的“檢測程序”(Check Routine)里將其一一調用,并設置合適的參數即可。
圖1.2 NeuroCheck 的使用方法
在工業應用中,一般需將目標元件固定在某位置,然后調節好工業相機的參數以使所得圖像良好;其次需要將所得圖像傳給NeuroCheck以進行分析,分析過程即是如上所說的在“檢測程序”里的函數模塊調用以及參數設置的過程;再次就是在NeuroCheck的自動模式中進行輸出量顯示配置,以使其滿足檢測需要;最后就是在自動模式中運行已設置好的該“檢測程序”,進行實時檢測并同時得到檢測結果。
二、eVision的主要功能及特點
eVision本身不提供獨立的操作界面,其操作者需要使用VB或者C++兩種編程語言作為載體,根據工程需要編制合適的操作界面,并同時調用eVision提供的庫函數以進行檢測。為給操作者提供方便,eVision提供了一套輔助工具 EasyAccess,用于對編程進行指導,告知編程者如何調用其庫函數。
當操作者使用EasyAccess并選擇相應功能時,EasyAccess會自動添加一些代碼,這些代碼即是編程者在VB或者C++中調用eVision庫函數時所需的代碼。
除此之外,為了更好的指導編程者使用,eVision還提供了一些已經用VB和VC++編好的實例,每個實例都對應一個主要的應用。
其主要應用功能有:
條形碼鑒別
矩形碼鑒別
存在性檢驗
特征量測量
字符與模式識別
色彩處理
圖像比較
斑點檢測
等等,也是涉及了機器視覺工業應用的各個主要領域。
三、NeuroCheck的插件接口
NeuroCheck各應用模塊的良好封裝性,為使用者,尤其是初學者帶來了很大的便利;但是同時,由于開發時的局限性,這樣的封裝性也給一些特殊應用帶來了不便。為解決這一問題,NeuroCheck的開發者們特意提供了一套接口,以便使用者針對其特殊需求編寫一些可以在NeuroCheck中使用的插件。編寫這些插件的比較合適的編程語言是C或者C++。[2]
以VC++開發環境為例,當編程者編寫好代碼后,需要將其生成為動態鏈接庫(DLL)文件,然后由NeuroCheck將這些文件加入到其插件庫中。完成這些之后,NeuroCheck和插件動態鏈接庫之間將通過獲取版本號、獲取函數數目、獲取函數說明、獲取數據類型、獲取數據描述這5個固有函數進行通信。
每一個插件可以包含若干個插件函數(Plug-In Function),這些插件函數在使用時就和NeuroCheck自帶的函數一樣。
每一個插件函數又包含有相當數目的子函數,其中主要的有初始化(Init)、逆初始化(Deinit)、執行(Exec)、對話框(Dialog)等幾個。在這些子函數中,則是使用者可以根據相應算法大量編寫代碼的地方,例如:
1. 在VC++環境下,編程者可以在資源編輯器中編輯合適的操作界面,即對話框,然后可以在對話框子函數中加入相應代碼,以使參數得以傳遞。
2. 如果需要在程序開始時傳遞默認參數,可以在初始化子函數中添加相應代碼。同時,初始化和逆初始化為一對必不可少的子函數,保證內存的分配與取消,以使NeuroCheck程序不會和系統或其他程序發生沖突。
3. 在執行子函數中,則包含了主要的算法。以本文的條形碼閱讀為例,則是包含了對各種以及特定某種條形碼解碼的算法,具體可參見下一章。
四、eVision的函數調用
不論是eVision還是NeuroCheck,當使用它們進行圖像處理操作時,一般首先都需要設定待處理區域,即通常所說的Region Of Interest (或者Area Of Interest)。但是eVision有一個特點,它的條形碼解碼算法功能比較強大,大多數情況下可以自動鎖定它的解碼區域,所以使用它的解碼函數時,只需要將整個圖像作為輸入參數傳遞。而使用NeuroCheck進行條形碼解碼,必須同時傳遞輸入圖像,以及手動設定的解碼區域。所以在NeuroCheck中使用eVision的函數進行條形碼解碼時,必須把傳遞給NeuroCheck的解碼區域參數轉化為新的圖像傳遞給eVision的函數。這樣就需要讀取該區域的位置參數,以及該區域內的圖像灰度值, 然后依靠這些灰度值重新組成一幅新圖像。
當輸入參數完成后,即可調用eVision的函數庫進行條形碼閱讀,eVision為此提供了一個叫做EBarcode的類。這個類主要有5種方法:第一種方法設定解碼區域的幾何參數;第二種方法設定解碼方式;第三種方法設定解碼參數,例如讀碼方向等;第四種方法設定待解碼類型,常用條形碼共有9種,非常用條形碼還有22種[3],這里待解碼類型可以設定為其中任何一種,也可以設定為其總和;最后一種方法即為解碼,但是根據待解碼類型為單一某種或總和,解碼方法也分為兩種。
解碼時,在大多數情況下,不需要使用EBarcode類的前三種方法,意即其相關參數選擇為默認值。然后選擇待解碼類型,并選擇相應的解碼方法即可。實際編碼時,需要在對話框子函數中將待解碼類型作為參數傳遞,然后在執行子函數中加入選擇性語句,使其能根據傳入的待解碼參數為單一碼種或總和而自動選擇相應的解碼方法。
解碼完成后,需要將結果存儲在NeuroCheck指定的一個字符數組中,然后可以由NeuroCheck內部的函數將其調用并顯示,同時也可以將其作為輸出參數傳遞,用于PLC的控制信號。
五、總結
如前所述,各種工業用機器視覺軟件都有各自的優缺點。NeuroCheck的使用簡單,但是其在條形碼閱讀時,不僅不能解碼128碼,而且還必須指定待解碼類型,甚至還需指定解碼之后的字符數目,所以當某些特殊情況需要解碼不明條形碼時,使用NeuroCheck就極其不不方便。而使用eVision雖然同時必須使用其它編程軟件,但是其函數庫功能相對比較強大,尤其是在條形碼閱讀方面。不過,在此方面eVision也有它的一些缺點。比如有些條形碼可以同時被不同的條形碼類型解碼,得到不同的答案。此時使用eVision的總和解碼方法,固然有其方便的優點,但是也有只能輸出一種結果的缺點。如果需要輸入所有可能性結果,然后做相似性比較的話,必須設定一個循環語句,然后在此循環內對所有可能的碼種作單一解碼,并輸出所有解碼成功的結果。
在熟練應用各種相關軟件的基礎上,了解其優缺點,各取其長而避其短,綜合成最合適于工程需要的處理方法,其意思是相當重大的。不僅可以解決一些憑單一軟件難以解決的問題,同時也因為可以避免重復購買軟件而節約成本,此外對開發具有自主知識產權的同類軟件業有很大的幫助。
文獻
[1] Robotic Industries Association.
[2] NeuroCheck. Programmer’s Reference.2006
[3] eVision .C++ Reference Manual.2004