黃惠迪,官洪運,鄧 昶,薛 節(jié)
(東華大學(xué) 信息科學(xué)與技術(shù)學(xué)院,上海 201620)
隨著社會的發(fā)展和交通工程的大量興起,車輛行駛安全問題也日益突出,并已今成為當(dāng)今汽車行業(yè)的一個關(guān)鍵問題。用于智能車輛導(dǎo)航系統(tǒng)的開發(fā)越來越受到研究者和廠商的關(guān)注,其中,基于圖像處理的車道線檢測以及車道偏離預(yù)警占據(jù)了重要的一個環(huán)節(jié)。通常汽車安全輔助系統(tǒng)需要高成本硬件設(shè)備來實現(xiàn),使得安全駕駛輔助系統(tǒng)尚未廣泛普及[1]。
作為移動設(shè)備搭載的主流操作系統(tǒng)之一,Android[1]是基于Linux平臺的開放性操作系統(tǒng)。它由多個組織推動標(biāo)準(zhǔn),達(dá)到了相當(dāng)高的開放程度,配置不同的硬件架構(gòu)都可以用以定制適用于自己的系統(tǒng),可以應(yīng)用與手機(jī)、平板電腦等多種移動智能終端設(shè)備之上。在Android系統(tǒng)對移動設(shè)備進(jìn)行優(yōu)化之后,非常適合于系統(tǒng)內(nèi)存有限以及處理性能不高的移動芯片運行。因此,利用智能手持設(shè)備的便攜性,本文在Android平臺上,設(shè)計開發(fā)車道線檢測和偏離預(yù)警的輕量級輔助駕駛應(yīng)用,使人們可以直接利用自己的安卓手機(jī)便可達(dá)到智能駕駛,安全出行的目的。
為了能夠在手機(jī)平臺上達(dá)到檢測準(zhǔn)確性,必須考慮光照條件、路面狀況、實時性等難點。對此,本文對傳統(tǒng)的車道線的檢測算法也做出了相應(yīng)的改進(jìn),提高自適應(yīng)性與魯棒性。
文中將利用OpenCV提供的函數(shù)庫實現(xiàn)車道線檢測的算法。先經(jīng)過色彩空間轉(zhuǎn)化、直方圖過均衡化、增強(qiáng)對比、去除噪聲、邊緣檢測等圖像預(yù)處理過程,隨后提出一種自適應(yīng)非監(jiān)督分類方法提取車道線。
在圖像處理中,為了降低運算的復(fù)雜性,經(jīng)常采用的方式是首先將彩色圖像灰度處理,根據(jù)不同原色對視覺亮度的反應(yīng)情況,彩色圖像取灰度值 Y=0.3×R+0.59×G+0.11×B。
在實際車輛行駛過程中會遇到光源太強(qiáng)致使整體畫面偏白,或者夜間行車光源太弱等情況降低車道線辨識度,本系統(tǒng)將會采用直方圖均衡化和高斯濾波去噪,使車道特征更明顯。
如果檢測車道線時如果對整張圖像進(jìn)行檢測,會受到大量背景雜物干擾增加系統(tǒng)計算量。考慮到車道線只出現(xiàn)在畫面下方,系統(tǒng)設(shè)置感興趣區(qū)域ROI范圍為圖像下方1/2矩形,在這個區(qū)域內(nèi)進(jìn)行圖像邊緣檢測。
通常把邊緣定義為圖像中灰度產(chǎn)生急劇變化的區(qū)域邊界,進(jìn)行微分運算,求得二階導(dǎo)數(shù)或梯度的最大值為零的點,再選取適當(dāng)?shù)拈撝祦硖崛∵吘?。常用的邊緣檢測算子有基于一階微分的如Sobel算子、Prewitt算子,基于二階階微分Laplace算子,還有Canny算子[2]。使用OpenCV中的Canny邊緣提取效果如圖 1(b)。
車道線檢測中最常用的識別方法之一是基于Hough變換。其原理是利用圖像空間和Hough參數(shù)空間的點-線的對偶性,把圖像空間中的問題轉(zhuǎn)換到參數(shù)空間中去。OpenCV中提供了Hough的函數(shù)cvHoughLines2實現(xiàn)了用于直線檢測的Hough變換方法[3],將極坐標(biāo)空間中局部峰值點予以返回。它支持標(biāo)準(zhǔn)Hough變換和累計概率Hough變換,其中累計概率Hough變換是在一定的范圍內(nèi)進(jìn)行霍夫變換,從而減少計算量,縮短計算時間。 直線檢測效果如圖 1(c)和 1(d)。
圖1 車道圖像預(yù)處理Fig.1 Image preprocessing
上節(jié)由Hough變換獲取的一個直線集合中僅有部分來自于所需提取的車道線,其他則是干擾線。在使用Hough變換過程中設(shè)置參數(shù)將虛線尋找出來,其中經(jīng)計算虛線最大間距約有30像素。假設(shè)Hough變換結(jié)果表示為集合L:
其中L是直線集合,r是元素總數(shù),Lx是點p0到pf點中的第x條直線。然后使用非監(jiān)督分類器尋找在集合L中的最優(yōu)直線。此處分類器共有兩個類,分別用于左右兩側(cè)車道線,相應(yīng)的定義為和C2,并對每個類的參數(shù)定義初始狀態(tài)。
每個類各自有兩個參數(shù),第一個是直線中點,第二個是直線斜率。參數(shù)初始狀態(tài)定義如下:
其中 Pmcx是 Cx 類的中點,Cx∈{C1,C2},Ix,max是圖像中的列數(shù),Iy,max是圖像中的行數(shù),Mcx是 Cx 類直線的斜率。公式(2)(3)中的比值系數(shù)由50張樣例圖像中計算均值得出。C1和C2兩個類與其參數(shù)相對應(yīng)的定義為:
根據(jù)每一幀的變化,參數(shù)對于實際車道線做出調(diào)整。本文為此使用自適應(yīng)方法將類的參數(shù)更接近于實際值。如果直線lp滿足(8)即可歸類為類Cx,否則刪除
dp,pmcx是直線 lp的中點與類 Cx的點 Pmcx之間的歐式距離,dP,Mcx是直線 lp的斜率與類 Cx的斜率 Mcx之間的差,dminpx是直線lp的中點與Pmcx之間最小距離,dminMx是斜率差的最小值。dminMx在這里設(shè)值為1.5,最小點間距是動態(tài)變化值,起始值設(shè)為對角線長度的85%。所用最小值均使用了啟發(fā)式方法定義,第二個值隨著下一幀的出現(xiàn)將會減小。參數(shù)Pmcx隨圖像變化而更新,由公式(9)獲得,
決策因子 α 范圍為(0,1)并基于二次方程定義為(10)。它作為權(quán)值取決于當(dāng)前處理的直線中點和類Cx中點之間距離當(dāng)距離縮短時,該點權(quán)值將在類的下一參數(shù)中提高。反之當(dāng)該點在較遠(yuǎn)處時,這一點對于整體貢獻(xiàn)較小。
為了避免在一些情況下可能出現(xiàn)對道路寬度估值增大,例如道路右側(cè)有一條分叉路導(dǎo)致在車道上出現(xiàn)一條新的直線,在(11)中定義了由直線中點間保持距離Dk的張量Tk,其中Dk由(12)表示。這里張量Tk通過點P1和P2定義,其中每一直線的中點pmcxk由ΔD檢查是否符合約束條件(13),ΔD為當(dāng)前幀中求得的距離導(dǎo)數(shù),g是目前ΔD中的最小值。
系統(tǒng)在Windows7操作系統(tǒng)Eclipse IDE中,使用OpenCV-2.4.7-android-sdk,基于Android SDK進(jìn)行開發(fā)。系統(tǒng)的核心算法代碼調(diào)用了底層基于C/C++語言的OpenCV開源庫來實現(xiàn)。雖然OpenCV提供了一部分支持Android環(huán)境的Java接口,但是考慮到優(yōu)化系統(tǒng)性能,本系統(tǒng)將在原生代碼上進(jìn)行移植。系統(tǒng)開發(fā)時將會涉及C/C++與Java之間混合調(diào)用,解決方法是使用標(biāo)準(zhǔn)Java函數(shù)接口(JNI)來改寫原生C/C++代碼,隨后使用集成了交叉編譯器的Android NDK開發(fā)C/C++動態(tài)鏈接庫 (so),將動態(tài)鏈接庫文件和java應(yīng)用打包成Android應(yīng)用程序apk[4]。圖2顯示了代碼編譯和調(diào)用過程。
圖2 Android應(yīng)用程序調(diào)用流程Fig.2 Android application implementation
OpenCV的庫將Android自身的與相機(jī)相關(guān)的庫進(jìn)行了封裝,通過SurfaceView顯示在手機(jī)屏幕上,這里只需要繼承Android.app中的Activity類并實現(xiàn)OpenCV提供的接口CvCameraViewListener2。啟動時加載OpenCV庫,在回調(diào)函數(shù)onManagerConnected中 調(diào) 用 CameraBridgeViewBase.enableView()連接相機(jī)獲取圖像[5-6]。
在NativeCameraView中的線程調(diào)用函數(shù)deliver And Draw Frame,更新其中發(fā)生變化的圖像。可以在on Camera Frame(CvCameraViewFrame inputFrame)中實現(xiàn)系統(tǒng)所需的處理代碼。
先將由CameraBridgeViewBase的setMaxFrameSize將輸入圖像inputFrame降低大小,隨后轉(zhuǎn)成灰度圖像,再用Imgproc提供的函數(shù)進(jìn)一步直方圖均衡、平滑降噪、提取邊緣、設(shè)置ROI等處理。利用Java提供的并發(fā)處理機(jī)制,建立線程池,ExecutorService對左右車道同時進(jìn)行處理。
程序主要部分代碼:
測試硬件使用 Samsung GT-N7100,其 CPU為四核Quad-Core ARM Cortex-A9 主頻 1.8 GHz,GPU 為 ARM Mali-400 MP4@533 MHz,操作系統(tǒng)為Android4.3,圖像獲取速率為30 fps。圖3中(a)是對于第一幀車道線檢測結(jié)果,此時分類結(jié)果來自于上文所設(shè)的類參數(shù)初始值。位于正中相交的兩條直線左側(cè)為C1類,右側(cè)為C2類,圖中同時標(biāo)出了對應(yīng)分類的直線中點位置??梢杂^察到在圖像兩側(cè)邊緣處有若干未經(jīng)分類的直線中點。
圖3中(b)是采集的第二幀圖像,從中可以明顯看出參數(shù)相對接近實際值,而在第四幀圖像(c)中估測直線以及幾乎與實際車道線重合。在實驗的下一幀圖像中,直線將更加接近于真實車道線。
圖3 直線分類結(jié)果Fig.3 Result of lines classifier
表1 不同環(huán)境下實驗結(jié)果對比Tab.1 Test result in different conditions
表1是在各個實驗情景下車道線檢測結(jié)果。在路面干擾較少情況下可以達(dá)到10f ps以上圖像處理速度,光線較弱時判別率相對較低。而實驗中由未經(jīng)預(yù)處理的圖像直接經(jīng)Hough變換檢測得到的干擾線較多,且每秒處理圖像在5幀左右。
文中在Android平臺上利用OpenCV庫進(jìn)行車道線檢測系統(tǒng)的開發(fā),充分說明了將車載安全預(yù)警系統(tǒng)移植到智能手機(jī)上的可行性。同時為解決在移動設(shè)備上圖像處理的性能問題,提出了自適應(yīng)的非監(jiān)督直線分類器。對直線車道線,包括彎道的直線部分,有快速準(zhǔn)確的判別效果。實驗結(jié)果表明該算法與傳統(tǒng)方法相比處理速度較快,判斷正確率較高。
[1]Milanés,Vicente.Intelligent automatic overtaking system using vision for vehicle detection[M].Expert Systems with Applications,2012,39(3):3362-3373.
[2]Parker,Jim R.Algorithms for image processing and computer vision[M].John Wiley&Sons,2010.
[3]Topal, Cihan, Cuneyt Akinlar,Yakup Gen.Edge drawing:a heuristic approach to robust real-time edge detection[C]//Pattern Recognition (ICPR), 2010 20th International Conference on.IEEE,2010.
[4]Le,Quoc V.Building high-level features using large scale unsupervised learning [C]//Acoustics,Speech and Signal Processing (ICASSP), 2013 IEEE International Conference on.IEEE,2013.
[5]Deepthi R S,Sankaraiah S.Implementation of Real-Time Image Analyzer Graphical User Interface Using OpenCV on Android Mobile Phone[J].Advanced Science Letters,2013,19(8):2174-2179.
[6]Baggio,Daniel Lélis. Mastering OpenCV with practical computer vision projects[M].Packt Publishing Ltd,2012.