邢飛,郭文成
(天津工業(yè)大學電氣工程與自動化學院,天津300000)
道路識別系統(tǒng),可以協(xié)助汽車司機安全駕駛,通過分析道路路況、車距以及識別車道線,減少車禍率。目前,Android系統(tǒng)主要借助底層的Skia圖形圖像處理庫進行圖像處理。但是Android系統(tǒng)在圖像處理方面的功能不是很完善,處理的能力相對有限,只能針對圖像進行簡單的變換,無法對復雜背景以及噪聲嚴重的圖像進行處理和識別。所以提出一種在Android系統(tǒng)下利用計算機視覺庫OpenCV進行圖像處理的方法。實驗證明,OpenCV庫可以方便地應用到Android系統(tǒng)中。
本文借助OpenCV圖像處理開發(fā)包,利用Android NDK技術實現(xiàn)了基于Android平臺的道路識別系統(tǒng)。
OpenCV是一個基于(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Windows和Mac OS操作系統(tǒng)上。它輕量級而且高效——由一系列C函數(shù)和少量C++類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法。OpenCV相對于MATLAB等其他常用的圖像處理軟件來說,還有其顯著的優(yōu)勢:
①OpenCV擁有包括300多個C函數(shù)的跨平臺的中高層API。它不依賴于其他的外部庫——盡管也可以使用某些外部庫。
②OpenCV對非商業(yè)應用和商業(yè)應用都是免費的。
③OpenCV為Intel Integrated Performance Primitives(IPP)提供了透明接口。這意味著如果有為特定處理器優(yōu)化的IPP庫,OpenCV將在運行時自動加載這些庫。
④可移植性好。OpenCV提供的視覺處理算法非常豐富,并且它部分以C語言編寫,加上其開源的特性,處理得當,不需要添加新的外部支持也可以完整地編譯鏈接生成執(zhí)行程序,所以很多人用它來做算法的移植。
Android開發(fā)平臺可以搭建在Windows操作系統(tǒng)下,也可以搭建在Linux操作系統(tǒng)下。本文是基于Linux操作系統(tǒng)下開發(fā)的,使用的是Ubuntu9.0操作系統(tǒng)。Android開發(fā)所需要的軟件主要有集成開發(fā)環(huán)境Eclipse、JDK、Android SDK和ADT插件。
自從OpenCV 2.2發(fā)布以來,OpenCV就可支持Android平臺,本文使用的版本是OpenCV 2.2.1。
①Android的開發(fā)平臺是使用Java語言進行開發(fā)的,而OpenCV由一系列C函數(shù)和少量C++類構成,所以想要在Android系統(tǒng)應用程序中調用基于C/C++編寫的OpenCV庫,則需要使用NDK對OpenCV源碼進行編譯,生成共享庫so文件。
②Android的應用程序開發(fā)框架提供給開發(fā)者的都是Java API,然而底層的本地庫是基于C/C++語言編寫的,所以需要一個機制將它轉換,之后提供給開發(fā)者Java接口。JNI(Java Native Interface)譯為Java本地接口,它使Java可以通過JNI調用C/C++的庫。
③為了使用戶能夠方便地在Android設備上安裝和使用本系統(tǒng),則需要將本系統(tǒng)打包成apk格式的應用軟件。通過Android應用程序編寫Java端的代碼,最后通過Android SDK生成Android應用程序.apk。
結構框圖如圖1所示。
圖1 結構框圖
本系統(tǒng)主要是通過在移動設備上應用安全駕駛的輔助程序來協(xié)助司機減少車禍的發(fā)生。構思圖如圖2所示,上邊圖像中的斜線為系統(tǒng)檢測的范圍,下邊圖像中的矩形框為車輛標識的對象,兩側直線為系統(tǒng)識別的車道線。該系統(tǒng)主要通過Android設備自帶的Video攝像頭功能采集視頻圖像,對攝像頭進行初始化和參數(shù)設置,將采集到的一幀數(shù)據(jù)傳給圖像處理模塊,以便進行車輛跟蹤和道路線檢測,之后將結果信息傳給提示警告模塊以便作出決策。
所以根據(jù)系統(tǒng)功能的分析,把道路識別系統(tǒng)分為視頻圖像采集模塊、圖像處理模塊和提示警告模塊。模塊劃分如圖3所示。
圖2 構思圖
Android系統(tǒng)的Linux內(nèi)核和驅動程序運行于內(nèi)核空間。Android設備的攝像頭就是由Linux提供的內(nèi)核標準的視頻驅動程序,即Video4Linux(Video for Linux),簡稱V4L。目前的版本為Video4Linux2(V4L2)。它驅動的Video設備可以支持捕獲及視頻輸出方式。圖像采集的流程圖如圖4所示。
圖3 模塊的劃分
圖4 圖像采集流程圖
本文利用攝像頭Intent捕獲視頻,部分代碼如下:_REQUEST_CODE);
startActivityForResult()方法執(zhí)行完畢,用戶攝像完畢(或取消操作)后,用戶界面返回應用程序,這時必須監(jiān)聽onActivityResult()方法來接收intent的返回結果并執(zhí)行后續(xù)操作。
圖像處理模塊主要包括車輛跟蹤和車道線檢測。這兩個功能是通過OpenCV自帶的庫函數(shù)進行實現(xiàn)的。
①車輛跟蹤主要運用的是基于Kalman濾波器的團塊跟蹤。首先,采用平均值法建立初始背景,對幀圖像進行濾波和去噪聲處理,并對背景進行減操作和OSTU自適應閾值算法檢測運動目標。其次,背景更新以便適應新的環(huán)境變化。最后是團塊跟蹤,主要是通過卡爾曼濾波器建立運動模型,對運動目標的下一步的運動進行預測,并用查找輪廓的方法繪制矩形區(qū)域圈住目標圖像,找到運動目標的重心,求出相對于自己車輛的距離。
②車道線檢測主要運用的是Hough變換。首先,通過Canny算法找到圖像的輪廓,然后用Hough變換檢測直線,最后用line()函數(shù)將直線畫出。在圖像中會檢查出很多條直線,因此通過車道線的角度,把檢測到的直線分成左右車道線兩組,對每一組進行排序,繪制找到的最長的車道線。
相關的一些函數(shù):
車道線和車輛識別結果如圖5所示。
所設計的道路識別系統(tǒng)主要通過發(fā)現(xiàn)一些異常駕駛行為來提醒司機安全駕駛,所以需要一些相應的提示和警告模塊。有以下異常時,系統(tǒng)會發(fā)出警告和提醒:
①當車身與其他車輛的距離在不正常的范圍時;
②當車速超過規(guī)定范圍時;
③當車身和車道線之間的位置出現(xiàn)異常時。
檢測到以上情況,用Android.media.SoundPool類實現(xiàn)聲音警報程序。
圖5 車道線和車輛識別結果
車輛識別系統(tǒng),可以提醒駕駛員安全駕駛以及避免交通事故的發(fā)生。軟件主要基于Android平臺開發(fā),利用了開源計算機視覺庫OpenCV的圖形圖像工具和Android NDK編程相結合,實現(xiàn)了基于Android平臺的道路識別系統(tǒng)。本系統(tǒng)還有許多不足之處,比如有時無法檢測到兩邊的車道線,報警系統(tǒng)還不是很完善,在下一步的研究中,會盡量完善和改進。
[1] Bradski G,Kaehler A.Learning OpenCV:Computer vision with the OpenCV library[M] .[s.l.] :O'reilly,2008.
[2] 劉瑞禎,于仕琪.OpenCV教程:基礎篇[M] .北京:北京航空航天大學出版社,2007.
[3] 姚昱旻,劉衛(wèi)國.Android的架構與應用開發(fā)研究[J] .計算機系統(tǒng)應用,2008,17(11):110-112.
[4] 韓露,李祖樞,陳東義.一種Java與OpenCV結合實現(xiàn)的目標檢測模塊[J] .計算機應用,2008,28(3):29-32.
[5] 任俊偉,林東岱.JNI技術實現(xiàn)跨平臺開發(fā)的研究[J] .計算機應用研究,2005,22(7):180-184.
[6] 王宏彬,李燈熬,趙菊敏,等.利用OpenCV實現(xiàn)在Android系統(tǒng)下的人臉檢測[J] .軟件,2011,32(12):4-7.
[7] 王連鵬.基于Android系統(tǒng)的手勢識別方法研究及應用[D] .齊齊哈爾:齊齊哈爾大學,2012.