劉慶宏 王聲文 白彥慶
(大連光洋科技集團(tuán)有限公司,遼寧 大連116600)
在工業(yè)應(yīng)用方面,機(jī)器視覺使機(jī)器人、機(jī)床具有視覺感知功能,是自動(dòng)化生產(chǎn)系統(tǒng),尤其是機(jī)器人系統(tǒng)的重要部分之一。機(jī)器視覺可以通過獲取數(shù)字圖像,并通過適當(dāng)?shù)乃惴ㄟM(jìn)行分析和識(shí)別,提取有效信息,用于指導(dǎo)生產(chǎn)。常見的機(jī)器視覺可以提供諸如零件定位、機(jī)器人運(yùn)動(dòng)軌跡規(guī)劃(障礙物判斷)、工件加工質(zhì)量判斷和異常情況檢測(cè)等功能。機(jī)器視覺的加入,使得自動(dòng)化生產(chǎn)系統(tǒng)可以更加智能地處理工作任務(wù),提高了系統(tǒng)的工作效率,降低了系統(tǒng)對(duì)于環(huán)境的依賴,拓展了系統(tǒng)的應(yīng)用領(lǐng)域。
在圖像處理和視覺識(shí)別方面,目前較為流行的基礎(chǔ)庫(kù)為OpenCV 庫(kù)。該庫(kù)的全稱是:Open Source Computer Vision Library。OpenCV 是一個(gè)開源發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),最初由Intel 公司發(fā)起并提供支持。可以運(yùn)行在Linux、Windows、Mac OS 等桌面操作系統(tǒng)以及Android 和IOS 等移動(dòng)操作系統(tǒng)上。該庫(kù)主要由C 和C+ +語言編寫完成,運(yùn)行效率較高,OpenCV 庫(kù)實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。目前該庫(kù)最近版本為3.0 alpha 版。OpenCV 庫(kù)的出現(xiàn)和完善,極大地降低了機(jī)器視覺方向的學(xué)習(xí)以及開發(fā)的難度。
進(jìn)行工業(yè)軟件開發(fā)所采用的基礎(chǔ)庫(kù)必須綜合考慮可靠性、穩(wěn)定性、效率以及成本等問題。OpenCV 作為開源軟件,所有代碼公開,全世界的計(jì)算機(jī)視覺專家都可以審查其代碼。這保證了該庫(kù)的可靠性和穩(wěn)定性,同時(shí)如果需要進(jìn)一步開發(fā),可以直接在已有源代碼基礎(chǔ)上進(jìn)行。由于OpenCV 使用運(yùn)行速度較快的C 和C+ + 語言開發(fā),并且支持多線程運(yùn)算以及基于OpenCL 的異構(gòu)運(yùn)算,充分利用了目前的計(jì)算機(jī)硬件運(yùn)算能力,運(yùn)行效率方面無明顯瓶頸。并且由于OpenCV 庫(kù)開源且免費(fèi),使用該庫(kù)本身成本較低。對(duì)比采用MatLab 的視覺識(shí)別方案以及類似Halcon 庫(kù)等商業(yè)化平臺(tái)而言,其商業(yè)成本基本可以忽略。
采用開源庫(kù)開發(fā)商業(yè)軟件或者作為商業(yè)應(yīng)用,必須慎重考慮開源庫(kù)的版權(quán)問題。開源并不代表完全免費(fèi),也不代表沒有任何約束。目前流行的開源協(xié)議有GPL、LGPL、BSD 和MIT 等多種協(xié)議,并不是每一種開源協(xié)議都允許使用者將開源代碼用于閉源的商業(yè)軟件開發(fā)。有的協(xié)議,如開源軟件中最流行的GPL 協(xié)議,甚至要求任何基于遵循該協(xié)議的開源軟件所做的修改或應(yīng)用,也要遵循該協(xié)議,不允許修改后和衍生的代碼作為閉源的商業(yè)軟件發(fā)布和銷售,即GPL 協(xié)議的開源傳染性。這方面比較著名的事件是思科公司的WRT54G 路由器事件,該事件發(fā)生于2003 年前后,該路由器的固件被發(fā)現(xiàn)是基于Linux 開發(fā)而成,而Linux遵循GPL 協(xié)議,因此思科公司不得不開放了該型號(hào)路由器的固件源代碼。雖然后來證明該舉動(dòng)甚至擴(kuò)大了該款路由器的知名度和銷售量,但對(duì)于絕大多數(shù)商業(yè)公司而言,開放產(chǎn)品源代碼都是不可接受的,因此在選擇開源庫(kù)用于開發(fā)時(shí),必須考慮到開源版權(quán)的約束,避免潛在的損失。OpenCV 的絕大部分模塊遵循較寬松的BSD 協(xié)議。BSD(berkeley software distribution)協(xié)議對(duì)商業(yè)應(yīng)用較為友好,允許在商業(yè)軟件中使用甚至修改遵循該協(xié)議的代碼或庫(kù),而商業(yè)軟件本身代碼無須開源,即允許閉源商業(yè)化應(yīng)用,僅要求保留原有開源版權(quán)聲明,因此應(yīng)用OpenCV 庫(kù)進(jìn)行商業(yè)開發(fā)限制較少。但要特別注意,由于OpenCV 中包含的一些特定算法,可能是專利算法或收費(fèi)算法,是不遵循BSD 協(xié)議的,比如應(yīng)用于人臉檢測(cè)的Ada -boost 算法等,不能直接免費(fèi)用于商業(yè)軟件,實(shí)際使用中要注意辨別。
應(yīng)用于實(shí)際工業(yè)生產(chǎn)環(huán)境的視覺識(shí)別軟件的實(shí)現(xiàn)通用流程如圖1。實(shí)際應(yīng)用中,處理流程按照從左到右的順序執(zhí)行。其中OpenCV 庫(kù)提供的功能,可以覆蓋除圖像獲取部分之外的所有模塊。
首先,需要從工業(yè)攝像頭等設(shè)備中獲取圖像信息。從軟件設(shè)計(jì)的角度講,通常,工業(yè)攝像頭可以抽象為流設(shè)備,從其驅(qū)動(dòng)中可以讀取到連續(xù)的圖像幀。機(jī)器視覺的第1 個(gè)模塊就是實(shí)現(xiàn)從不同的攝像頭驅(qū)動(dòng)中獲取圖像信息并轉(zhuǎn)化為OpenCV 支持的圖像數(shù)據(jù)結(jié)構(gòu)的模塊。目前常見的工業(yè)相機(jī)接口有GIGE Vision、Camera Link、USB 和1394 等接口,OpenCV 提供了原生的USB攝像頭以及部分品牌的GIGEVision 相機(jī)的支持。實(shí)際上,由于通常情況下工業(yè)攝像機(jī)的廠商會(huì)提供設(shè)備驅(qū)動(dòng),因此圖像獲取部分無須OpenCV 的特別支持。
從原始設(shè)備中獲取的圖像信息,包含噪聲、陰影、反光等干擾,影響有效信息判斷。需要進(jìn)行圖像增強(qiáng),如濾波、平滑、開閉、均衡化等圖像操作,去除無效干擾信息,加強(qiáng)有效信息。同時(shí),由于很多特征分析算法,都是僅支持單通道圖像(黑白圖像),甚至針對(duì)二值化圖像,這里也需要針對(duì)具體需求進(jìn)行圖像的轉(zhuǎn)換工作。這些工作均由預(yù)處理模塊完成,OpenCV 提供了常見的圖像操作的支持。
經(jīng)過預(yù)處理后的圖像,需要交給特征分析模塊進(jìn)行特征的分析提取工作。目前圖像識(shí)別方面主要使用的特征包括顏色、紋理、形狀等,針對(duì)不同的特征,有不同的提取算法,需要根據(jù)工作環(huán)境以及識(shí)別目標(biāo)進(jìn)行具體分析。經(jīng)過特征分析后,獲得的是有用的信息描述,而不再是一張圖像。例如輪廓特征提取,獲取到的是輪廓上所有點(diǎn)的坐標(biāo)順序描述鏈表。
提取到的特征需要與用戶事先設(shè)定的目標(biāo)特征進(jìn)行對(duì)比,符合用戶要求的特征給予通過,否則放棄。特征對(duì)比,針對(duì)不同的特征分析,有不同的特征對(duì)比算法,如針對(duì)輪廓,通??梢圆捎镁仄ヅ?。較有效的方法如Hu 不變矩,該方法對(duì)輪廓的縮放和旋轉(zhuǎn)不敏感,可以在實(shí)際應(yīng)用中得到較好的匹配結(jié)果。OpenCV 提供了常用的特征提取和匹配算法。
通過特征提取對(duì)比等工作后,從原始圖像中可以獲取到零個(gè)至若干個(gè)符合結(jié)果。所有的結(jié)果均處在圖像坐標(biāo)系下,以像素為單位。該信息不能直接用于驅(qū)動(dòng)生產(chǎn),需要通過畸變矯正、坐標(biāo)變換等工作將結(jié)果的坐標(biāo)信息(如位置,角度等)從圖像坐標(biāo)系變換到空間坐標(biāo)系下。該項(xiàng)工作的絕大部分函數(shù)在OpenCV 中也有支持。
以上流程是視覺識(shí)別的基本工作流程,實(shí)際上,還需要例如識(shí)別目標(biāo)特征提取存儲(chǔ)、現(xiàn)場(chǎng)光照補(bǔ)償?shù)绕渌ぷ鬟M(jìn)行保障才能完成機(jī)器視覺的全部功能。
視覺識(shí)別軟件作為完整的商業(yè)軟件,僅僅提供算法接口實(shí)現(xiàn)圖像識(shí)別的基本功能是不夠的,還需要有諸如用戶操作界面、數(shù)據(jù)庫(kù)保存和索引等諸多外圍功能,協(xié)助用戶完成視覺識(shí)別的調(diào)試、監(jiān)控等工作。
OpenCV 提供了跨平臺(tái)的通用界面接口HighGUI(high-level graphical uer iterface)模塊。該模塊提供了諸如圖像文件讀入,圖像窗口顯示,鼠標(biāo)事件等操作支持,并提供滑動(dòng)條,按鈕開關(guān)等GUI 控件。但該模塊僅提供較為基礎(chǔ)的界面功能,可以作為簡(jiǎn)單的可視化工具在OpenCV 學(xué)習(xí)及軟件開發(fā)調(diào)試過程中使用,并不適合作為商業(yè)化軟件的界面。實(shí)際上,作為軟件工程的重要組成部分,GUI 界面通常是有專門的庫(kù)支持的,如微軟公司的MFC 庫(kù)以及最初由奇趣公司發(fā)起的QT 等。為了配合OpenCV 構(gòu)建跨平臺(tái)的視覺識(shí)別軟件,這里采用了基于LGPL 開源協(xié)議版本的QT 作為界面庫(kù)進(jìn)行用戶操作界面的開發(fā)以及數(shù)據(jù)庫(kù)操作。
下面以筆者公司實(shí)際生產(chǎn)環(huán)境下的機(jī)器人工件識(shí)別解決方案為例,介紹視覺識(shí)別工作的流程。
首先,基于設(shè)備布局走線、工業(yè)環(huán)境可靠性、成本等因素綜合分析,解決方案的工業(yè)攝像頭選擇了支持POE(power over ethernet)供電的GIGE Vision 接口的工業(yè)相機(jī),該接口物理形式與千兆以太網(wǎng)兼容,并能通過RJ45 接口的標(biāo)準(zhǔn)網(wǎng)線同時(shí)實(shí)現(xiàn)信號(hào)的傳遞與電源供給,可以實(shí)現(xiàn)從設(shè)備到主機(jī)僅用1 根線纜連接的最簡(jiǎn)布置。同時(shí)該接口無需主機(jī)有額外的板卡設(shè)備,并且相對(duì)于USB 等接口有較遠(yuǎn)的傳輸距離和更高的可靠性。該方案以較低的成本和復(fù)雜度滿足了工業(yè)需求。
從工業(yè)攝像頭獲取的原始圖像,經(jīng)過預(yù)處理、特征提取和特征匹配等工作,最終獲取有用的信息供機(jī)器人拾取使用,由于圖像整體的特征提取流程與目標(biāo)部分的處理有類似之處,為清晰起見,這里以識(shí)別目標(biāo)的提取處理為例。
如圖2 為通過工業(yè)攝像頭獲取的靜態(tài)圖像中截取的目標(biāo)模板部分原始圖像,該圖像為8BIT 灰度圖像。視覺識(shí)別以此為參照,凡是符合該模板特征的部分,均識(shí)別為工件。
圖3 是經(jīng)過平滑去噪以及開閉操作后的圖像,經(jīng)過以上操作,圖像的背景噪聲得到了較好的抑制,并且沒有丟失邊緣等關(guān)鍵信息。
圖4 為經(jīng)過閾值化操作之后的二值圖像,后續(xù)的特征提取和分析操作均基于此二值圖像。
圖5 為針對(duì)圖4 的二值圖像進(jìn)行輪廓提取后得到的關(guān)鍵輪廓特征,這里采用了工件外輪廓以及4 個(gè)最大的螺釘孔輪廓作為特征,以后的識(shí)別均以此特征作為目標(biāo)。
圖6 為實(shí)際匹配效果,在工件拾取平臺(tái)上的16 個(gè)空位中放置了8 個(gè)工件,放置角度均不一致,位置也沒有精確對(duì)齊,通過圖像的輪廓特征比對(duì),最終實(shí)現(xiàn)了工件的識(shí)別和空位的排除,對(duì)于識(shí)別出的工件,在圖像中繪制了其最小包圍盒以及軸對(duì)齊包圍盒為標(biāo)志。這里運(yùn)用了Hu 不變矩匹配,但同時(shí)考慮到Hu 不變矩對(duì)于輪廓縮放不敏感的問題,綜合比較了輪廓的周長(zhǎng)和面積,最終取得了滿意的效果。
OpenCV 計(jì)算機(jī)視覺函數(shù)庫(kù),提供了常用的視覺識(shí)別算法,并且遵循BSD 開源協(xié)議,除了作為科研樣本,同樣也可以用于工業(yè)軟件開發(fā),并可以取得較好的識(shí)別效果。
[1]Gary Bardski,Adrain kaebler.學(xué)習(xí)OpenCV 中文版[M].于仕琪,劉瑞禎,譯.北京:清華大學(xué)出版社,2009.
[2]Mark S Nixon.特征提取與圖像處理[M].李實(shí)英,楊高波,譯.2 版.北京:電子工業(yè)出版社,2010.
[3]章毓晉.圖像處理和分析基礎(chǔ)[M].北京:高等教育出版社,2002.