李 婉
(陜西國防工業職業技術學院,陜西 西安 710300)
智能小車在避障時,識別障礙物的輪廓邊緣非常重要。在圖像處理中,灰度值變化是在圖像邊緣最明顯的特征之一,所以邊緣檢測是障礙物識別的核心。對圖像中各像素點進行求微分或二階微分來找到邊緣像素點,這樣就可以完成邊緣檢測[1]。
對于圖像邊緣檢測,國內外常用的算法有一階導數和二階導數邊緣檢測算法[2-4]。Canny算法是目前最優的一階邊緣檢測算法,其他算法在處理圖像時,圖像必須要經過提前降噪等一系列處理,而Canny算法可以省略這一步,因為Canny算法本身可以完成對圖像的降噪等預處理。Canny邊緣檢測的主要步驟如下。
1)高斯濾波。濾波的主要目的是對圖像處理算法進行降噪,采用高斯濾波會使圖像變平滑并增大邊緣的寬度。在一個位于(a,b)的像素點上,其灰度值可用f(a,b)來表示,高斯濾波的過程就是讓高斯矩陣和每一個像素點相乘,最終經過高斯濾波的灰度值gσ(a,b)如公式(1)所示:
2)計算梯度大小和方向。在圖像處理中,通常會采用梯度來表示灰度值變化比較大的像素點,其變化包括程度與方向,因此對于邊緣圖像灰度值變化的計算,常采用一階導差分數法,將圖像矩陣f(a,b)與卷積模板J1、J2進行卷積,J1、J2如公式(2)、(3)所示:


卷積后分別得到像素點(a,b)處水平方向的幅度值gx(a,b)與垂直方向的幅度值gy(a,b),再通過梯度公式(4)和(5)計算得到梯度值和梯度方向。

3)非極大值抑制。在對圖像進行降噪處理時,采用的高斯濾波會將圖像邊緣增大,使得原本不是邊緣的像素點,也會被列入到圖像邊緣,所以需要采用非極大值抑制來過濾不是邊緣上的像素點,目的就是讓圖像邊緣的寬度盡可能為1個像素點,即位于圖像邊緣的像素點在梯度方向上的梯度值達到最大。這里添加一個類似于判斷函數,判斷像素點是否在梯度方向上的梯度值是最大,將最大值設為T,否則不是邊緣,將灰度值設為0。
4)使用雙閾值進行邊緣連接。經過上述三步后,已經能得到邊緣質量較高的圖像,但不能排除所有“偽邊緣”存在。Canny使用了高低兩個閾值作為滯后閾值,若像素值小于低閾值則去除該像素;若大于高閾值則認為是邊緣;介于高低閾值中間的像素需要進一步計算選擇連接的像素點,直到圖像閉合。
智能小車障礙物識別如圖1所示,選用深度相機與Jetsion TX1作為硬件平臺來進行智能小車周圍環境的獲取與處理[5]。

圖1 智能小車采集環境信息示意圖
示意圖中紅色空間直角坐標系(Zm-Ym)為智能小車運行坐標系,藍色直角坐標系(Zc-Yc)為深度相機視覺范圍坐標系。在障礙物識別過程中,需對圖像的深度進行分析,而深度相機對障礙物圖像進行采集時,采集到的是像素點數據,無法直接顯示圖片的深度,所以需將深度圖的數據先轉化為灰度圖。為了降低灰度化的圖像輪廓上出現突起等問題,需進行形態學濾波、邊緣檢測等一系列操作,將障礙物標記出來。具體過程如圖2所示[1]。

圖2 障礙物識別流程圖
本文深度相機采集的像素點實際數據是障礙物到相機的距離。距離范圍在0.1 m~25 m之間,但智能小車因體型的局限,實際可用范圍在0.5 m~3 m之間,所以在設置安全距離時,將3 m以外的距離內障礙物設置為0,拍攝的照片及深度圖如圖3所示。

圖3 拍攝的照片及深度圖
在深度圖灰度化處理的這一步中,需要進行數據格式轉換,即對深度相機采集的深度圖像數據格式采用OpenCV的convertTo函數進行轉換[6]。
將采集到的圖像進行深度灰度化處理后,對圖像繼續進行二值化處理?;叶葓D有256個亮度等級,為了讓圖像只出現黑色或白色,采用圖像二值化讓圖像上包含的所有像素點灰度值為0或255。經過圖像二值化處理后的圖像如圖4所示。

圖4 二值化圖像
環境等不確定因素會使采集的圖像中包含一些非障礙物,若這些非障礙物不做處理,經過二值化處理后可能會被誤判成障礙物,所以需要設定一個閾值,閾值將采集的所有數據分為兩部分,即定義當灰度大于閾值時為最大值,灰度小于閾值時為0,這里用到的二值化函數原型為:cv2.threshold(img, threshold, maxval, type)。
深度相機受外界環境影響,物體上會出現小洞,為了填充小洞,需采用閉運算來去除黑洞,并平滑邊界。而形態學濾波對于圖像處理來說本質和濾波器一樣,能對圖像進行降噪、邊緣增強等作用。本文中采用形態學濾波主要是為了進行閉運算處理[7]。最終運算處理后的結果如圖5所示。

圖5 形態學濾波后的圖像
障礙物圖像邊緣檢測可大幅減少數據量,剔除不相關信息,保留圖像結構屬性。本過程采用Canny函數來進行處理圖5圖形的邊緣檢測。
最終通過Canny算子處理后,再進行取反操作得到的圖像如圖6所示。

圖6 障礙物邊緣檢測圖
經Canny算法可以檢測出障礙物輪廓邊緣的像素,但輸出的圖片并沒有將每一個像素點進行連接,因此需要在OpenCV函數庫先查找圖像邊緣每個像素點,然后使用drawContours函數將像素點輪廓繪制出來,最終得到的圖像如圖7所示。

圖7 繪制的邊緣輪廓
本實驗中采集的圖像相對較簡單,而實際中遇到棱角比較多且突出的障礙物時,根據以上的步驟難以分辨哪些區域可以在安全范圍內通過。實際應用中,人的手掌指縫外部范圍可以通過,而指縫是不能通過的,若不將指縫的間距進行特殊標記,經過算法識別后會判別可以通過,這種誤判會影響智能小車的行駛路徑,所以這些區域要在算法上進行排除處理。將手掌輪廓外部每個部分最突出的點進行連接,如圖8所示,直線連接后形成一個閉合的輪廓。在圖像處理中將這種圍成的邊界稱為圖像的凸包,當實際的圖像形成凸包后,可以近似認為整個凸包為障礙物,這樣做的目的是增大小車安全有效的路徑行駛。

圖8 凸包
所以需要算法能準確找出凸包輪廓像素點,此過程本文采用的是OpenCV中的convexHull函數來尋找凸包,使用drawContours函數來繪制凸包輪廓像素點。
對圖7進行凸包輪廓像素點的繪制,得到圖如圖9所示,圖中紅色線條(凸起部分)為識別出來的障礙物輪廓,黑色線條(平滑部分)為障礙物輪廓的凸包[1,8]。隨后將凸包進行形態學膨脹,目的是將輪廓凸包加粗外擴,如圖10所示。

圖9 輪廓凸包

圖10 膨脹后凸包圖
避障只是智能小車行駛過程中的功能之一,在識別完障礙物后還需對行駛的路徑進行規劃。為了使智能小車能及時地做出路徑規劃,則需要對圖片進行壓縮處理,壓縮圖片不會使圖像變形,反而使計算的像素點減小,縮短了識別時間[9-10]。本文使用的深度相機采集到的圖片大小為1 080×720,用OpenCV中的resize函數將圖像進行壓縮,最終壓縮為200×200。
為了驗證此算法是否適用于識別復雜的環境信息,用采集的室外圖像11(a)進行驗證,最終得到識別出的障礙物圖像如圖11(b)所示。因此提出該算法可以實現智能小車對障礙物的識別。

圖11 采集的室外圖像與識別結果
本文介紹了障礙物識別的相關原理及算法,核心選用Canny算法對障礙物輪廓進行識別。在智能小車移動的過程中,采用深度相機對一定范圍內的環境進行圖像采集,并將圖像采用OpenCV函數進行二值化、濾波、邊緣檢測、標記輪廓凸包、調整圖像尺寸等一系列算法的處理,得到障礙物識別圖。最終經過驗證,不論在簡單或復雜的環境中均可以識別出障礙物。