侯賓+張文志+戴源成+田洪強
摘 ?要: 針對機器人視覺中對目標物體的拾取問題,提出一種基于OpenCV函數(shù)對從攝像頭輸入的目標物體的顏色及輪廓進行有效識別的方法。首先利用攝像頭讀取目標物體及周圍環(huán)境,經(jīng)一系列圖像處理后進行目標物體的顏色識別,在此基礎(chǔ)上進行Canny邊緣檢測并查找輪廓,最后將輪廓顯示。結(jié)果表明,該實驗程序可以很好地完成對目標物體的顏色及輪廓提取,且有效地避免了目標物體周圍相近顏色的干擾。
關(guān)鍵詞: 機器人視覺; 顏色識別; 輪廓識別; Canny邊緣檢測
中圖分類號: TN919?34; TP391 ? ? ? ? ? ? ? ?文獻標識碼: A ? ? ? ? ? ? ? ? ? ? ?文章編號: 1004?373X(2014)24?0076?04
Method of objects color and contour recognition based on OpenCV
HOU Bin, ZHANG Wen?zhi, DAI Yuan?cheng, TIAN Hong?qiang
(Inner Mongolia University of Technology, Huhhot 010051, China)
Abstract: Aiming at the problem of recognizing the target object in robot visual, a way based on OpenCV is proposed, which can effectively recognize the color and the contour of ?the objects from the camera. The target object and its surrounding environment are read out by camera, and then the color of the object is recognized after a series of image processing. On the basis of this, the Canny edge detection is carried on, and the contour is determined and displayed. The results show that the expe?
rimental procedure can complete the extraction of target objects' color and contour perfectly, and avoid the interference of similar color around objects effectively.
Keywords: robot vision; color recognition; contour recognition; Canny edge detection
0 ?引 ?言
機器人視覺是機器人感知外部世界的重要媒介,也是未來機器人傳感器發(fā)展的主流方向。機器人視覺通過視覺傳感器獲取環(huán)境的圖像數(shù)據(jù),并通過軟件進行圖像的分析和理解,使機器人能夠辨識目標物體及確定其位置[1]。隨著機器人技術(shù)的快速發(fā)展及其在工業(yè)、醫(yī)學(xué)、軍事等領(lǐng)域的廣泛應(yīng)用,機器人視覺技術(shù)取得了快速發(fā)展,對機器人靈敏感知周圍環(huán)境的能力要求也不斷提高[2]。對目標物體的精確識別問題是機器人視覺中最基本的環(huán)節(jié),而顏色識別和輪廓識別又是進行其他深入研究的基礎(chǔ)。目前在這方面的主要應(yīng)用是單一的對顏色或輪廓的提取。
基于上述情況,本文提出了基于OpenCV函數(shù)庫,對攝像頭取景范圍內(nèi)目標物體顏色及輪廓共同精確提取的方法。利用OpenCV函數(shù)庫中提供的函數(shù),對目標物體首先進行各種圖像學(xué)方面的預(yù)處理以使得到的圖像符合實驗要求,然后利用閾值調(diào)節(jié)進行顏色識別,最后在顏色識別的基礎(chǔ)上進行邊緣檢測及輪廓識別。
1 ?OpenCV簡介
OpenCV是由Intel公司資助的開源計算機視覺庫,它由一系列C函數(shù)和少量C ++類所組成,可實現(xiàn)圖像處理和計算機視覺方面的很多通用算法,例如特征檢測與跟蹤、運動分析、目標分割與識別以及3D重建等[3?4]。由于OpenCV的源代碼是完全開放的,而且源代碼的編寫簡潔而又高效,所以近年來在國內(nèi)外的圖像處理相關(guān)領(lǐng)域中被廣泛地使用,成為一種流行的圖像處理函數(shù)庫。本實驗是在Windows XP系統(tǒng)下基于OpenCV 1.0版本及VC++ 6.0環(huán)境下實現(xiàn)的。
2 ?顏色空間的選取
顏色空間的用途是在某些標準下用通??山邮艿姆绞綄Σ噬右哉f明。常用的顏色空間有RGB,CMY,HSV,HSI等。本文采用的顏色空間為RGB和HSV[5]。
RGB(紅、綠、藍)如圖1所示,可將R,G,B看成一個三維的坐標系,其中每一個坐標點都代表了一種顏色。HSV顏色空間,如圖2所示。Hue表示的是顏色,通常使用一個帶有角度的圓形表示。Saturation表示的是飽和度,在圓心處的取值是0,表示顏色很淡,沿著圓的半徑方向增大顏色越來越濃。Value表示的是顏色的亮度,在圓錐的底端Value表示的是黑色,在頂端是白色。在實際中,RGB顏色表示容易受到強光,弱光,陰影等因素的影響。相比之下,HSV空間面對這些光照的變化更穩(wěn)定一些,能很好地反應(yīng)顏色的本質(zhì)。
本實驗采用普通CCD攝像頭讀入RGB顏色,再將RGB顏色轉(zhuǎn)換為HSV顏色。在OpenCV中RGB轉(zhuǎn)換到HSV時,對Hue通道的存儲是用一個字節(jié)(8位)來表示,取值為[0,255],而Hue的取值[0,360],故需將Hue取值壓縮一倍為[0,180]。其余兩個量的取值為[0,255]。
3 ?算法實現(xiàn)
如圖3所示為整個算法的大體流程圖。
3.1 ?圖像獲取及預(yù)處理
利用普通CCD攝像頭獲取周圍環(huán)境圖像,對獲取的圖像進行平滑濾波處理[6]:
(1) 進行高斯濾波處理。由于高斯濾波器是一個低通濾波器故適合進行平滑濾波處理,相對于均值濾波它的平滑效果更柔和,而且邊緣保留得也更好。
高斯濾波函數(shù):cvSmooth( src,dst,CV_GAUSSIAN,3,3,0,0)。src為輸入的源圖像,dst為輸出的圖像。由于真實圖像在空間內(nèi)的像素是緩慢變化的,鄰近點的像素變化不會很明顯,但是隨機的兩個點就可能形成很大的像素差(也就是說空間上噪聲點不是相互聯(lián)系的),正是基于這一點,高斯濾波在保留信號的條件下減少了噪聲[3]。
(2) 中值濾波器(CV_MEDIAN)將中心像素的正方形鄰域內(nèi)的每個像素值用中間像素值替換?;谄骄惴ǖ膕imple blur對噪聲圖像特別是有大的孤立點的圖像非常敏感,即使有少量點存在較大差異也會導(dǎo)致平均值的明顯波動,因此中值濾波可以通過選擇中間值避免這些點的影響[7]。
中值濾波函數(shù):cvSmooth( src,dst,CV_MEDIAN,3,3,0,0)。
基于兩種濾波器各自的特點及互補的特性故在程序中同時使用了這兩種濾波函數(shù)以使得到的圖像更平滑從而減少噪聲影響。
3.2 ?顏色空間轉(zhuǎn)換及圖像通道的分離
由于HSV顏色空間相比于RGB顏色空間的優(yōu)越性,故將RGB轉(zhuǎn)化為HSV。
RGB到HSV的數(shù)學(xué)轉(zhuǎn)換函數(shù)如下所示:
[k1=max{r,g,b},k2=min{r,g,b};v=k1255] (1)
[s=0, ? ? ? ? ? ? ? ? ? ? k1=0(k1-k2)k1, ? ? k1≠0] (2)
[h=(0+g-bk1-k2)×60, ? ? ? s≠0,k1=r(2+b-rk1-k2)×60, ? ? ? s≠0,k1=g(4+r-gk1-k2)×60, ? ? ? s≠0,k1=bundefined, ? ? ? ? ? ? ? ? ? s=0] (3)
式中:r,g,b為RGB顏色空間中紅色、綠色、藍色3個分量的值;h,s,v為HSV顏色空間中色度、飽和度、亮度的值。采用下列函數(shù)實現(xiàn)RGB到HSV轉(zhuǎn)換:cvCvtColor(src,dst,CV_BGR2HSV)。
接下來對得到的HSV圖像進行通道分離,分離為3個單通道圖像,分別為H(色度通道圖像)、S(飽和度通道圖像)及V(亮度通道圖像)。采用如下函數(shù)實現(xiàn):cvCvtPixToPlane(src,H,S,V,0)。
3.3 ?創(chuàng)建滑動條及閾值化處理
創(chuàng)建滑動條的目的是返回所想要的顏色參數(shù)閾值。本實驗設(shè)定了6個調(diào)節(jié)參數(shù)LowHue(色度下限值)、HighHue(色度上限值)、LowSaturation(飽和度下限值)、HighSaturation(飽和度上限值)、LowBrightness(亮度下限值)、int HighBrightness(亮度上限值)。cvInRangeS( )函數(shù)用于檢查圖像中像素的灰度是否屬于某一指定范圍。可以通過接收滑動條返回的各個閾值而得到目標顏色的色度、飽和度和亮度單通道圖像。
3.4 ?圖像生成及圖像形態(tài)學(xué)處理
應(yīng)用“cvAnd()”函數(shù)對得到的三個單通道圖像進行按位與運算,最后得到檢測目標的二值圖像。但是得到的圖像會出現(xiàn)噪聲,故接下來需對得到的圖像進行圖像形態(tài)學(xué)處理。
采用膨脹腐蝕的方法進行處理得到的圖像,可以明顯去除或減少噪點,使得到的目標體進行最大的連通。膨脹是指將一些圖像與核進行卷積,求局部最大值的操作,數(shù)學(xué)公式為:
[dst(x,y)=max{src(x+x′,y+y′)}] ?(4)
[(x′,y′)∈kernel]
式中: dst 為輸出圖像; src 為輸入源圖像; kernel 為用于腐蝕或膨脹的核結(jié)構(gòu)元素,本實驗選取的核大小為3×3像素如圖4所示。
腐蝕是膨脹的反操作。腐蝕操作要計算核區(qū)域像素的最小值。腐蝕的數(shù)學(xué)函數(shù)為:
[dst(x,y)=min{src(x+x′,y+y′)}] ?(5)
在OpenCV中膨脹采用的函數(shù)是“cvDilate()”,腐蝕函數(shù)為“cvErode()”。
一般來說,膨脹擴展了區(qū)域,而腐蝕縮小區(qū)域。膨脹可以填補凹洞,腐蝕能夠消除凸起。腐蝕操作通常是用來消除圖像中的“斑點”噪聲,可以將斑點腐蝕掉,且能確保圖像內(nèi)的較大區(qū)域依然存在。在試圖找到連通分支(即具有相似顏色或強度的像素點的大塊的互相分離的區(qū)域)時通常使用膨脹操作。故程序中采用先膨脹后腐蝕的方法可以有效的去除被檢測到物體的邊緣噪點及其他噪聲影響[8]。
3.5 ?查找輪廓和繪制輪廓
Canny邊緣檢測法是最常用到的進行邊緣檢測的方法,其最重要的特點是試圖將獨立的候選像素拼裝成輪廓[9]。輪廓的形成是對這些像素運用滯后性閾值,本實驗所采用的上下限閾值比為3∶1。Canny 邊緣檢測算法是高斯函數(shù)的一階導(dǎo)數(shù),是對信噪比與定位精度之乘積的最優(yōu)化逼近算子[7]。
Canny 算法(見圖5)首先用二維高斯函數(shù)的一階導(dǎo)數(shù), 對圖像進行平滑, 設(shè)二維高斯函數(shù)為:
[G(x,y)=12πσ2exp-x2+y22σ2] (6)
其梯度矢量為:
[?G=?G/?x?G/?y] (7)
通過上式進行平滑, 抑制圖像噪聲。其中σ為平滑參數(shù), σ較小時, 邊緣定位精度高, 但圖像平滑作用較弱, 抑制噪聲的能力差;σ較大時則相反。梯度計算完成平滑后接下來進行“非極大值抑制”細化梯度幅值矩陣,尋找圖像中的可能邊緣點; 最后進行“雙門限檢測”則是通過雙閾值遞歸尋找圖像邊緣點, 實現(xiàn)邊緣提取[10]。
實現(xiàn)Canny檢測的OpenCV函數(shù)是 cvCanny(src,dst,50,150,3),該函數(shù)需要輸入一幅灰度圖,輸出也是一幅灰度圖。進行完邊緣檢測緊接著把圖像輸出給查找輪廓函數(shù)即“cvFindContours()”,從二值圖像中檢索輪廓,并返回檢測到的輪廓的個數(shù)。
利用“cvDrawContours()”函數(shù)在屏幕上繪制檢測到的輪廓。繪制的屏幕圖像可以選擇源圖像。
4 ?實驗結(jié)果及分析
根據(jù)上述算法思想和實現(xiàn)過程,在Windows XP系統(tǒng)中使用VC++ 6.0和OpenCV 1. 0 來實現(xiàn)目標物體的顏色檢測及輪廓檢測實驗。本文采用的是普通的CCD攝像頭,若采用分辨率更高的攝像頭其執(zhí)行后的效果會更好。
圖6為從攝像頭直接讀取的視頻截圖,未經(jīng)OpenCV的函數(shù)處理。
圖7為對一藍色目標物體進行顏色拾取,圖8為所需的色度、飽和度和亮度的閾值。通過調(diào)節(jié)所需的閾值可以有效的拾取目標的顏色。目標物體與背景的顏色較為相近,用實驗中的算法可以有效的區(qū)分目標體與背景。
圖9為在拾取顏色的前提下進行輪廓的拾取,可以看出輪廓能夠很精確地識別出,由于是先拾取顏色所以可以將其他顏色的物體區(qū)別開。根據(jù)顏色進行輪廓提取可以很好的避免與目標物體輪廓相近的物體的影響。
圖10~圖12為在同一視頻流中對另外的紅色物體進行拾取,可以看到目標物體中的紅色斑點可以很好的拾取出來。最后在顏色拾取的基礎(chǔ)上輪廓也很好的拾取了。背景中的桌面發(fā)黃色,在色度中黃色的閾值范圍緊挨著紅色的閾值范圍,但通過實驗效果可以看出,紅色和黃色完全可以區(qū)分且根本沒有影響。
以上兩組截圖為來自同一攝像頭的視頻流輸入,從實驗結(jié)果截圖可以看出該程序較好的拾取了目標物體的顏色及輪廓,對顏色的獲取結(jié)果令人滿意,基本可以去除周圍其他相近顏色的干擾。
5 ?結(jié) ?論
采用OpenCV開發(fā)的目標物體顏色及輪廓識別程序可以得到比較理想的實驗效果。采用此設(shè)計的算法復(fù)雜度并不高,易于實現(xiàn),加上OpenCV庫設(shè)計高效率性,可以快捷地實現(xiàn)圖像的處理。
實驗結(jié)果表明,本文設(shè)計的目標物體顏色及輪廓同時精確識別的程序具有較高的可行性。這種先通過顏色閾值滑動條調(diào)整確定出目標物體,再在此基礎(chǔ)上對目標物體進行輪廓提取的方法比單一的目標顏色提取或輪廓提取更實用更便捷,為目標跟蹤及其他視覺方面的研究奠定了基礎(chǔ)。
參考文獻
[1] 徐德,譚民,李原.機器人視覺測量與控制[M].2版.北京:國防工業(yè)出版社,2011.
[2] R西格沃特,I R 諾巴克什,D 斯卡拉穆扎.自主移動機器人導(dǎo)論[M].李人厚,宋青松,譯.2版.西安:西安交通大學(xué)出版社,2013.
[3] BRADSKI Gary, KAEHLER Adrian.學(xué)習(xí)OpenCV(中文版)[M].于仕琪,劉瑞禎,譯.北京:清華大學(xué)出版社,2009.
[4] 馬新明,趙曉莉,時雷,等.基于OpenCV的圖像處理系統(tǒng)設(shè)計與實現(xiàn)[J].河南農(nóng)業(yè)大學(xué)學(xué)報,2014(1):87?90.
[5] 章毓晉.圖像工程(上冊):圖像處理[M].2版.北京:清華大學(xué)出版社,2007.
[6] LIN C, TANG Y L. Research and design of the intelligent surveillance system based on DirectShow and ?OpenCV ?[C]// IEEE conference on Consumer Electronics, Communications and Networks. Piscataway, NJ, USA: IEEE, 2011: 4307?4310.
[7] STEGER C, ULRICH M, WIEDEMANN C. 機器視覺算法與應(yīng)用[M].楊少榮,吳迪靖,段德山,譯.北京:清華大學(xué)出版社,2008.
[8] 劉瑞禎,于仕琪.OpenCV教程基礎(chǔ)篇[M].北京:北京航空航天大學(xué)出版社,2007.
[9] 黃凱奇,任偉強,譚鐵牛.圖像物體分類與檢測算法綜述[J].計算機學(xué)報,2014(6):1225?1240.
[10] 王娜,李霞.一種新的改進Canny邊緣檢測算法[J].深圳大學(xué)學(xué)報,2005(2):149?153.
[11] 崔鵬.基于視頻去噪算法移動機器人視覺定位研究[J].現(xiàn)代電子技術(shù),2012,35(20):111?113.