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