劉金清,陳存弟
1(福州外語外貿(mào)學(xué)院,福州 350202)
2(福建師范大學(xué) 光電與信息工程學(xué)院,醫(yī)學(xué)光電科學(xué)與技術(shù)教育部重點實驗室,福州 350007)
車道偏離檢測和前向車距檢測的目的是防止無人車偏離本車道或者與前方車輛距離較近時發(fā)生交通事故.近年來,國內(nèi)外學(xué)者基于機(jī)器視覺的方法對車道偏離[1-4]和車距檢測技術(shù)[5-7]展開了相應(yīng)的研究.本文在前人研究的基礎(chǔ)上,實現(xiàn)了車道偏離和車距檢測算法的改進(jìn)與仿真,并移植到嵌入式平臺上測試.
車道偏離檢測算法和車輛前向車距檢測算法均需要通過相機(jī)采集的圖像重建出三維世界,以此算出客觀世界中的真實數(shù)據(jù).在機(jī)器視覺中,三維重建可以定義為根據(jù)圖像坐標(biāo)系與世界坐標(biāo)系的轉(zhuǎn)換關(guān)系進(jìn)而計算到相機(jī)參數(shù),進(jìn)一步推導(dǎo)出圖像坐標(biāo)與世界坐標(biāo)系的關(guān)系,因此車道偏離檢測與防撞檢測的首要條件是相機(jī)標(biāo)定.本文采用張氏相機(jī)標(biāo)定方法[8].
相機(jī)標(biāo)定的理論推導(dǎo)涉及4 種坐標(biāo)系,分別是以像素為單位的像素平面坐標(biāo)系(u,v);表示每毫米包含的像素數(shù)量的圖像物理坐標(biāo)系(x,y);相機(jī)坐標(biāo)系(Xc,Yc,Zc)和世界坐標(biāo)系(Xw,Yw,Zw).如圖1 所示.
圖1 坐標(biāo)映射模型
(1)圖像物理坐標(biāo)系到像素坐標(biāo)系的轉(zhuǎn)換
圖像像素坐標(biāo)系(u,v)中的u和v分別表示行和列,其坐標(biāo)原點在圖像的左上角.圖像物理坐標(biāo)系(x,y)的x和y分別與圖像像素的u、v軸平行,相機(jī)的光心與像平面的交點為坐標(biāo)原點.假設(shè)光心對應(yīng)的圖像平面坐標(biāo)為(u0,v0),dx表示x方向每個像素的毫米寬度,dy表示表示y方向每個像素的毫米寬度,式(1)為圖像坐標(biāo)系轉(zhuǎn)換為像素坐標(biāo)系.
(2)相機(jī)坐標(biāo)系到物理坐標(biāo)系的轉(zhuǎn)換
光心是相機(jī)坐標(biāo)系(Xc,Yc,Zc)的原點,Zc軸與光軸重合且方向相同,Xc與Yc軸各自平行于圖像物理坐標(biāo)系的x和y軸.令相機(jī)的焦距為f,相機(jī)坐標(biāo)系與像素坐標(biāo)系的關(guān)系式為式(2)所示.
(3)世界坐標(biāo)系到相機(jī)坐標(biāo)系的轉(zhuǎn)換
世界坐標(biāo)系(Xw,Yw,Zw)到相機(jī)坐標(biāo)的轉(zhuǎn)換實質(zhì)上是平移和旋轉(zhuǎn)的過程,其中旋轉(zhuǎn)矩陣T為三維平移矢量,旋轉(zhuǎn)矩陣R為3×3 的正交單位矩陣,其轉(zhuǎn)換關(guān)系為式(3)所示.
整合4 個坐標(biāo)系的轉(zhuǎn)換關(guān)系,可以得出像素坐標(biāo)系與世界坐標(biāo)系的變換過程,其轉(zhuǎn)換過程為:
式(4)中包 含 有fdx、fdy、u0、v0等4 個 相關(guān)參數(shù),[R,T]是相機(jī)的外參矩陣.在相機(jī)的內(nèi)參數(shù)已知的情況下,就能得到像素坐標(biāo)與世界坐標(biāo)之間的投影矩陣P=A[R,T].因此,對于世界坐標(biāo)上的任意點M(Xw,Yw,Zw)可以計算出對應(yīng)的像素坐標(biāo)(u,v),但是P具有不可逆性,不能用已知的像素坐標(biāo)推導(dǎo)出世界坐標(biāo),而在車道偏離檢測與車距檢測中均需要從像素坐標(biāo)計算出世界中客觀的物理量,這就需要在已知相機(jī)內(nèi)外參數(shù)情況下再次建立相應(yīng)的路面模型計算出相關(guān)的物理量.
(4)求解相機(jī)畸變參數(shù)
在幾何光學(xué)和陰極射線管顯示中,畸變是對直線投影的一種偏移,即一條直線投影到圖片上并不是以直線的形式投影在圖像上.一般將畸變分成對圖像的投影影響較大的徑向畸變和切向畸變,其表達(dá)式為:
(5)OpenCV 上的相機(jī)標(biāo)定
張氏標(biāo)定法簡單穩(wěn)定,因此得到廣泛的使用.具體標(biāo)定步驟如下:
① 制作棋盤標(biāo)定板:在固定的相機(jī)角度下,拍攝不同角度,多尺度且旋轉(zhuǎn)多變的棋盤圖像20 張,棋盤格數(shù)為9×5.
② 令棋盤的左上角為世界坐標(biāo)原點,初始化棋盤格上所有角點的世界坐標(biāo),且Xw軸與Yw軸分別對應(yīng)棋盤的長和寬,Zw=0,每個棋盤格的長寬為30×30 mm,如圖2 所示.圖3 為檢測到的棋盤角點結(jié)果.
圖2 棋盤世界坐標(biāo)
圖3 棋盤角點坐標(biāo)
③ 引用calibrateCamera()函數(shù)計算相機(jī)的內(nèi)外參數(shù)和畸變參數(shù)得到的標(biāo)定參數(shù)為:
畸變系數(shù):
相機(jī)內(nèi)參矩陣:
車距檢測模型,如圖4 所示.假設(shè)相機(jī)能夠獲取的路面區(qū)域為ABCD,路面E點投影在圖像最頂邊的Eo點上;F點是相機(jī)剛好拍到靠近相機(jī)的路面邊界處,其投影在圖像最底邊Fo點上,G點是相機(jī)光心射向的路面焦點,該點投影在圖像的o點處;路面上隨意的P點投影在Po點處;Q點表示相機(jī)的位置,h、ZF和ZG可用尺子測量.∠ZQF=γ ,∠FQG=β,∠TQG=α.假設(shè)P點是檢測到的車輛,計算車距即是求解路面上ZP距離,Z是相機(jī)在路面上的投影點.
圖4 路面車距檢測模型
根據(jù)圖4 的路面建模圖,結(jié)合相機(jī)成像規(guī)則,可以得到以下關(guān)系:
本文在實驗室通過模擬車道來測試算法的可靠性.相機(jī)光心投影在圖像上的像素坐標(biāo)為(u0,v0)=(268.62,192.25),x方向的焦距為fdx=885.78,y方向的焦距為fdy=882.80,相機(jī)距離地面的高度為h=690 mm,通過實地測量相機(jī)投影在路面與圖像最低邊在真實路面上的距離為ZF=2050 mm.
圖5 中隨機(jī)的路面坐標(biāo)Po(300,295),投影在真實路面上的數(shù)據(jù)為:PT=197.13 mm,ZT=5520.95 mm,通過歐氏公式隨機(jī)路面點到相機(jī)的距離為:ZP=5524.47 mm,實際距離為5400 mm.模擬的車輛位置與相機(jī)的偏離角度為右偏2.05 度.計算結(jié)果與實際測量的結(jié)果之差僅為| 5524.47-5400|=124.47 mm.
圖5 畸變校正與路面測距模擬結(jié)果圖
表1 中的距離結(jié)果以mm 為單位,角度單位為度,從模擬路面上的6 組數(shù)據(jù)中可以看出,實際值與測量值的誤差較小,在10 m 內(nèi)的誤差控制在200 mm 內(nèi),說明本文建立的車距測量模型較準(zhǔn)確.在實際的高速路面上,安全車距不少于50 米,可以通過本文的算法設(shè)置固定的車距安全閾值來實現(xiàn)車距安全檢測.
表1 無人車相對于光軸的偏航角和車距測量表
由于無人車駕駛過程中容易出現(xiàn)偏航現(xiàn)象,如果不及時調(diào)整方向便會偏離到其他車道.此外,車輛壓到分道線導(dǎo)致左輪或者右輪偏離在其他車道中,將影響其他車輛的正常運行,甚至導(dǎo)致不可預(yù)知的交通事件,因此需要車道偏離提示.車輛準(zhǔn)備超車時會提前打開左轉(zhuǎn)向燈,所以,無人車在沒有檢測到左轉(zhuǎn)向燈打開時,車道偏離報警系統(tǒng)才會發(fā)揮相應(yīng)的警報作用.
無人車正常行駛時,行駛方向與左右分道線趨近平行,因而,可以利用車道俯視圖模型來計算出偏航的角度和車輛與左右分道的邊距,以做出相應(yīng)的報警信息反饋.
CCP 算法需要預(yù)知無人車的橫向?qū)挾萣c和車道寬度bl,標(biāo)準(zhǔn)高速公路的車道寬度為3.75 m,可以通過式(6)判斷車道偏離情況.y0表示無人車中心與車道中線的距離.如果△y1<0 或△y2<0,則認(rèn)為是車道偏離;如果 △y1>0 和△y2>0則認(rèn)為是無人車在當(dāng)前行駛的車道內(nèi).如果判別到無人車是左偏離,那么如圖6 所示,可知 △y1是 車輛與左分道線的距離,△y2是車輛與右分道線的距離;如果判別到無人車是右偏離,那么 △y1是車輛與右線的距離,△y2是車輛與左線的距離.
圖6 CCP 車道偏離檢測
相機(jī)的光心在圖像上的坐標(biāo)為(u0,v0),因此圖像中坐標(biāo)點Fo(u0,Ih)為相機(jī)光軸投影在地面上投影的點,Ih是圖像的高,Iw為圖像的寬.如圖7 所示,是一張車身右偏而行駛方向偏左的圖像,圖中L1和L2是左右車道線,L3是L1和L2交叉角的平分線,Pt(u,v)是L3上任意一點,L3與 圖像底邊的交點為V(u,v).
圖7 車向偏離示意圖
如圖8 所示,在路面上建立一個路面坐標(biāo),以分道線平行的中線為正向y軸,無人車所在的位置橫向為x軸,右方向為正,其中θ 是無人車的偏航角,∠FVoPo=φ,Ib是相機(jī)成像后靠近車輛的底邊,Vo、Po分別是圖像中V、Pt點的實際路面投影點,Po為隨機(jī)投影點,像素坐標(biāo)中直線u=u0與車道平分線的交點投影在路面上,即是圖中Po點.
圖8 車輛偏離俯視圖模型
(1)無人車偏航角的計算
① 余太武[9]計算左右車道的角平分線作為車道中線,而本文計算車道中線的方法是基于左右車道斜率和截距求平均的方法.
如圖9 所示,基于角平分線求解車道中線的方法存在誤差,而基于式(7)求解的結(jié)果正確.
圖9 求解車道中線的比較
② 基于2.1 節(jié)介紹的路面建模圖像,我們隨機(jī)取車道中線上的某點Pt,接下來,計算出車道中線上V點坐標(biāo),分別計算出Fo, V,Pt,分別對應(yīng)在路面上的F,Vo,Po點 ,以此計算出實際路面上的距離|FVo|、 |PoVo|和|FPo|.
根據(jù)余弦定理求∠FV0P0=φ:
③ 計算偏航角:
(2)無人車與左右分道線的距離計算
② 若Fo.u>V.u,可初步判斷為車輛向左偏離車道中線.
無人車距左分道線距離為:
無人車距右分道線距離:
③ 若Fo.u<V.u,可初步判斷為車輛右偏離車道中線
無人車距左分道線距離:
無人車距右分道線距離:
獲取到無人車與左右分道線的偏離距離和偏航角后,就可以設(shè)定相應(yīng)的閾值來判斷當(dāng)前無人車的行駛狀況.如圖10 所示,沿車道方向分割成安全區(qū)域和報警區(qū)域.對于一般小車寬度為1.5-1.8 m 之間,標(biāo)準(zhǔn)高速路寬度為3.7 m.本文設(shè)置車輛與左右分道線0.5 m范圍內(nèi)為報警區(qū),車道中間2.75 m 內(nèi)為安全區(qū).
圖10 車道安全區(qū)域與報警區(qū)域的劃分
如圖11 所示為兩幀車道偏離檢測結(jié)果,其中第1 行輸出為車輛左輪與左分道線的間距和右輪與右分道線的間距;第2 行輸出為車輛行駛方向與車道中線的偏航角,當(dāng)偏航角小于5 度時表示行駛方向正常.第3 行表示車輛當(dāng)前的運行狀態(tài),只有當(dāng)偏航角、無人車與左右分道線的間距不超過設(shè)定的安全閾值時才會斷定為正常行駛.
圖11 車道偏離檢測結(jié)果
如圖12 所示,本文實驗?zāi)M的車道寬度為120 cm,車輛寬度為36 cm,相機(jī)投影在地面到圖像底邊的實際地面邊界的距離為205 cm,其高為70 cm,模擬得到的結(jié)果為表2 和表3.
圖12 模擬偏航試驗圖
表2 無人車相對于車道的偏航角(度)
表3 無人車與左右分道線距離
TI 公司的DM3730[10,11]整合了具有控制優(yōu)勢的ARM 核和具有運算優(yōu)勢的DSP 核.DSP 端依靠DSP/BIOS 操作系統(tǒng)來支持音視頻算法,ARM 端依靠Linux 系統(tǒng)來控制芯片的外部設(shè)備,而ARM 與DSP 雙核之間的數(shù)據(jù)傳輸與通信則依賴Codec Engine 架構(gòu)來管理[12].ARM+DSP 框架如圖13 所示.
圖13 DSP+ARM 雙核框架
(1)處理器:DM3730 處理器.
① Pin-to-Pin 兼容DM3730 系列處理器.
② 1000-MHz 主頻ARM CortesxTM-A8 內(nèi)核.
③ 800-MHz DSP TMS320C64x+TM 內(nèi)核.
④ 片內(nèi)集成存儲器用于ARM CPU(16 KB ICache,16 KB D-Cache,256 KB L2 Cache)和片上存儲(64 KB SHared SDRAM,112 KB ROM).
(2)存儲器:Micron mDDR 與NandFlash 集成芯片.
① 256 MByte 32 位mDDR 133 MHz.
② 512 MByte 16 位Nand Flash.
(3)視頻接口、USB 接口、音頻插座、調(diào)試接口、SD/MMC 插座、電源接口、串口插座、擴(kuò)展接口、網(wǎng)絡(luò)接口.
搭建軟件開發(fā)平臺的資源有:VirtualBox;uBuntu V10.04;PC 端的超級終端Tera Term Pro.
安裝TI 提供的支持音頻和視頻算法的DVSDK組件包,該包含有各算法支持庫和各支持庫的調(diào)用管理引擎(Code Engine),以及XDM 算法的編譯工具xdctools,同時提供了音頻、視頻算法進(jìn)行編解碼的例程以供參考.利用該包可以很方便地開發(fā)DSP 下的圖像語音處理軟件,并且實現(xiàn)ARM 與DSP 之間的聯(lián)系.Codec Engine 是DVSDK 組件包的核心模塊,是ARM 和DSP 的通信與數(shù)據(jù)傳輸橋梁,過渡于ARM 應(yīng)用層和DSP 信號處理層之間.該模塊要與DSP 端建立的Codec Engine 服務(wù)器進(jìn)行通信需要使用DSP/BIOS、DSP Link、DSP 算法接口的標(biāo)準(zhǔn)xDIAS[13]和XDM 協(xié)議.為了發(fā)揮DM3730 的雙核作用,Codec Engine、DSP Link、xDIAS 和XDM 是軟件中不可缺少的部分.
DM3730 開發(fā)板可以從板載的NandFlash 中啟動,也可以從SD 卡的Fat32 分區(qū)中啟動.無論是從板載的NandFlash 中啟動還是從SD 卡啟動,都需要用XLoader對開發(fā)板進(jìn)行一些初始化工作,接著從NandFlash/SD中讀取Uboot 程序到存儲器,然后Uboot 從NandFlash/SD卡讀入啟動參數(shù),加載Linux 內(nèi)核uImage 到存儲器,解壓縮后運行,直到Linux 內(nèi)核啟動后,重新初始化DM3730 板,加載NandFlash/SD 卡上的FileSystem,執(zhí)行FileSystem 中的程序并啟動控制臺.由此可見,開發(fā)板上的Xloader、Uboot、uImage 和文件系統(tǒng)在整個啟動過程是層層依賴的關(guān)系.
安裝DVSDK 組件包后有自帶的交叉編譯器—arm-arago-linux-gnueabi-gcc.只需將DVSDK 組件包中的交叉編譯器的安裝路徑添加在用戶目錄中的.bashrc文件中即可.
TFTP 網(wǎng)絡(luò)能將編譯的程序和數(shù)據(jù)燒寫到目標(biāo)版上運行,或?qū)⒛繕?biāo)版上文件或者運行結(jié)果上傳到Linux主機(jī)端.tftp 工作目錄在/tftpboot,在文件傳輸過程中,均需要先將文件拷貝到該目錄下,然后才能在超級終端Tera Term Pro 中使用以下命令實現(xiàn)uBuntu 和目標(biāo)板中文件的傳輸:
(1)tftp -g -r fileName uBuntu 的IP 地址
(2)tftp -p -l fileName uBuntu 的IP 地址
(3)g:get,-r:remote,-p:put,-l:local
OpenCV 開源的視覺庫提供了豐富的圖像處理算法,在各大操作系統(tǒng)上均可編譯通過生成相應(yīng)的執(zhí)行文件,因此,這些代碼只要經(jīng)過適當(dāng)修改和編譯便可移植在嵌入式系統(tǒng)中.
EMCV 庫基于C 語言實現(xiàn),能運行于TI DM64x系列DSP 中,移植EMCV 相當(dāng)于把OpenCV 中少部分算法移植到DSP 中[14].
在DM3730 的ARM 應(yīng)用程序中調(diào)用交叉編譯后的OpenCV 接口函數(shù),而在DSP 端調(diào)用EMCV 接口函數(shù).適用cmake 交叉編譯OpenCV 庫之前,需要編譯安裝ffmpeg 資源包、libx264 和libxvid 兩個庫、匯編編譯器yasm,以及l(fā)ibpng 和libjpeg 庫,OpenCV 才能讀取和顯示png 和jpeg 格式圖片,而libpng 庫的安裝依賴于zlib 庫.
所有庫的安裝目錄均設(shè)置在交叉編譯的目錄中,且將編譯安裝后的生成庫通過tftp 網(wǎng)絡(luò)傳送到目標(biāo)板的lib 目錄上.至此,就可以實現(xiàn)在DM3730 目標(biāo)板的ARM 端調(diào)用OpenCV 庫函數(shù)了.
本文使用Qt 開發(fā)圖形界面對處理后的視頻在LCD 上顯示.先在Qt 中的項目文件.pro 中添加OpenCV的頭文件路徑和庫文件.編譯后生成的二進(jìn)制文件傳送到目標(biāo)板的文件系統(tǒng)上就可以在ARM 端調(diào)用OpenCV 函數(shù)接口,處理后的結(jié)果使用Qt 來顯示.
使用Codec Engine 作為ARM 和DSP 的連接橋梁,模仿Codec Engine 自帶的video_copy 例程來添加算法.針對EMCV 的移植,將EMCV 的文件添加到video_copy 中,并在配置文件中添加EMCV 的文件名.車道識別和車輛檢測算法移植后,進(jìn)而測試本文的車道偏離檢測和車距安全檢測算法,得到的效果良好.
TI 的DVSDK 組件包提供了Codec Engine 軟件模塊來實現(xiàn)ARM 和DSP 的通信和協(xié)同工作.Codec Engine 是一組應(yīng)用程序編程接口,用于實例化和運行xDAIS 算法,還有VISA(Video,Image,Speech,Audio)接口,用于與xDM 兼容的xDAIS 算法進(jìn)行交互[15,16],使ARM 端的Linux 可以調(diào)用VISA 標(biāo)準(zhǔn)接口來管理ARM 與DSP 的軟件.如圖14 所示,Codec Engine 框架中,Server 集成Codec 端算法,DSPLink 模塊隱藏了APP 調(diào)用Server 端算法的整個過程,因此在實例應(yīng)用中只能看到Server 和APP 端.
圖14 ARM 與DSP 的通信框架
如圖15 所示,ARM 應(yīng)用程序調(diào)用Codec Engine的VISA API 接口,VIDENC_process(a,b,c)傳遞a,b,c參數(shù),Codec Engine 的stub 會把參數(shù)a,b,c以及VISA 接口信息封裝處理,利用消息隊列msgq 傳遞給DSP 端.DSP 端的skeleton 解開這個封裝包,把ARM端的參數(shù)a,b,c(虛擬地址)轉(zhuǎn)換成DSP 端的參數(shù)x,y,z(物理地址).DSP 端的處理process 中的請求即能實現(xiàn)ARM 端VIDENC_process(a,b,c)函數(shù)的操作[17,18].
圖15 ARM 和DSP 通信的函數(shù)傳遞
圖16 為本文算法移植在DM3730 平臺上的運行結(jié)果.已知采集高速車道視頻的相機(jī)內(nèi)外參,使用本文的車距模型和車道偏離模型,計算的車距和車道偏離角度均顯示在圖片上.車輛正常行駛拍攝到的視頻得到的檢測結(jié)果良好.
圖16 本文算法在DM3730 平臺上的運行結(jié)果圖
本文的車距檢測模型[19],不但能夠檢測前方車輛與無人車的距離,還能計算出前方車輛相對于相機(jī)光軸的偏轉(zhuǎn)角度.基于CCP 車道偏離算法,建立車道偏離模型,實現(xiàn)了無人車當(dāng)前位置和相對于分道線的偏航角的計算,并設(shè)定無人車在車道上的安全區(qū)和警報區(qū)實現(xiàn)車道偏離的及時報警.對于車距的建模,在實驗室模擬車道計算路面上的隨機(jī)點,得到的誤差較小,穩(wěn)定性較好.對于車道偏離檢測,模擬高速路車道搭建車道偏離模型,計算車輛偏離車道的偏航角且車輛與左右分道線的距離,檢測誤差范圍小,準(zhǔn)確性較高.還使用運行狀況良好的高速路視頻測試本文算法,偏離反饋均顯示正常.盡管本文采用先進(jìn)的ARM+DSP 框架實現(xiàn)車輛動態(tài)圖像識別的系統(tǒng)設(shè)計,且采用Codec Engine 框架實現(xiàn)ARM 和DSP 的通信,實驗過程穩(wěn)定性較高,但是在嵌入式平臺內(nèi)存和運行主頻有限且運行算法尚未優(yōu)化的情況下難以實現(xiàn)算法的實時性處理,因此有待完善運行平臺,更好地協(xié)調(diào)車道檢測、車輛檢測與跟蹤、車道偏離檢測和車距檢測4 個模塊.有待進(jìn)一步使用本文的算法在路面上測試.