劉金清,陳存弟
1(福州外語外貿學院,福州 350202)
2(福建師范大學 光電與信息工程學院,醫學光電科學與技術教育部重點實驗室,福州 350007)
車道偏離檢測和前向車距檢測的目的是防止無人車偏離本車道或者與前方車輛距離較近時發生交通事故.近年來,國內外學者基于機器視覺的方法對車道偏離[1-4]和車距檢測技術[5-7]展開了相應的研究.本文在前人研究的基礎上,實現了車道偏離和車距檢測算法的改進與仿真,并移植到嵌入式平臺上測試.
車道偏離檢測算法和車輛前向車距檢測算法均需要通過相機采集的圖像重建出三維世界,以此算出客觀世界中的真實數據.在機器視覺中,三維重建可以定義為根據圖像坐標系與世界坐標系的轉換關系進而計算到相機參數,進一步推導出圖像坐標與世界坐標系的關系,因此車道偏離檢測與防撞檢測的首要條件是相機標定.本文采用張氏相機標定方法[8].
相機標定的理論推導涉及4 種坐標系,分別是以像素為單位的像素平面坐標系(u,v);表示每毫米包含的像素數量的圖像物理坐標系(x,y);相機坐標系(Xc,Yc,Zc)和世界坐標系(Xw,Yw,Zw).如圖1 所示.

圖1 坐標映射模型
(1)圖像物理坐標系到像素坐標系的轉換
圖像像素坐標系(u,v)中的u和v分別表示行和列,其坐標原點在圖像的左上角.圖像物理坐標系(x,y)的x和y分別與圖像像素的u、v軸平行,相機的光心與像平面的交點為坐標原點.假設光心對應的圖像平面坐標為(u0,v0),dx表示x方向每個像素的毫米寬度,dy表示表示y方向每個像素的毫米寬度,式(1)為圖像坐標系轉換為像素坐標系.

(2)相機坐標系到物理坐標系的轉換
光心是相機坐標系(Xc,Yc,Zc)的原點,Zc軸與光軸重合且方向相同,Xc與Yc軸各自平行于圖像物理坐標系的x和y軸.令相機的焦距為f,相機坐標系與像素坐標系的關系式為式(2)所示.

(3)世界坐標系到相機坐標系的轉換
世界坐標系(Xw,Yw,Zw)到相機坐標的轉換實質上是平移和旋轉的過程,其中旋轉矩陣T為三維平移矢量,旋轉矩陣R為3×3 的正交單位矩陣,其轉換關系為式(3)所示.

整合4 個坐標系的轉換關系,可以得出像素坐標系與世界坐標系的變換過程,其轉換過程為:

式(4)中包 含 有fdx、fdy、u0、v0等4 個 相關參數,[R,T]是相機的外參矩陣.在相機的內參數已知的情況下,就能得到像素坐標與世界坐標之間的投影矩陣P=A[R,T].因此,對于世界坐標上的任意點M(Xw,Yw,Zw)可以計算出對應的像素坐標(u,v),但是P具有不可逆性,不能用已知的像素坐標推導出世界坐標,而在車道偏離檢測與車距檢測中均需要從像素坐標計算出世界中客觀的物理量,這就需要在已知相機內外參數情況下再次建立相應的路面模型計算出相關的物理量.
(4)求解相機畸變參數
在幾何光學和陰極射線管顯示中,畸變是對直線投影的一種偏移,即一條直線投影到圖片上并不是以直線的形式投影在圖像上.一般將畸變分成對圖像的投影影響較大的徑向畸變和切向畸變,其表達式為:

(5)OpenCV 上的相機標定
張氏標定法簡單穩定,因此得到廣泛的使用.具體標定步驟如下:
① 制作棋盤標定板:在固定的相機角度下,拍攝不同角度,多尺度且旋轉多變的棋盤圖像20 張,棋盤格數為9×5.
② 令棋盤的左上角為世界坐標原點,初始化棋盤格上所有角點的世界坐標,且Xw軸與Yw軸分別對應棋盤的長和寬,Zw=0,每個棋盤格的長寬為30×30 mm,如圖2 所示.圖3 為檢測到的棋盤角點結果.

圖2 棋盤世界坐標

圖3 棋盤角點坐標
③ 引用calibrateCamera()函數計算相機的內外參數和畸變參數得到的標定參數為:
畸變系數:

相機內參矩陣:

車距檢測模型,如圖4 所示.假設相機能夠獲取的路面區域為ABCD,路面E點投影在圖像最頂邊的Eo點上;F點是相機剛好拍到靠近相機的路面邊界處,其投影在圖像最底邊Fo點上,G點是相機光心射向的路面焦點,該點投影在圖像的o點處;路面上隨意的P點投影在Po點處;Q點表示相機的位置,h、ZF和ZG可用尺子測量.∠ZQF=γ ,∠FQG=β,∠TQG=α.假設P點是檢測到的車輛,計算車距即是求解路面上ZP距離,Z是相機在路面上的投影點.

圖4 路面車距檢測模型
根據圖4 的路面建模圖,結合相機成像規則,可以得到以下關系:

本文在實驗室通過模擬車道來測試算法的可靠性.相機光心投影在圖像上的像素坐標為(u0,v0)=(268.62,192.25),x方向的焦距為fdx=885.78,y方向的焦距為fdy=882.80,相機距離地面的高度為h=690 mm,通過實地測量相機投影在路面與圖像最低邊在真實路面上的距離為ZF=2050 mm.
圖5 中隨機的路面坐標Po(300,295),投影在真實路面上的數據為:PT=197.13 mm,ZT=5520.95 mm,通過歐氏公式隨機路面點到相機的距離為:ZP=5524.47 mm,實際距離為5400 mm.模擬的車輛位置與相機的偏離角度為右偏2.05 度.計算結果與實際測量的結果之差僅為| 5524.47-5400|=124.47 mm.

圖5 畸變校正與路面測距模擬結果圖
表1 中的距離結果以mm 為單位,角度單位為度,從模擬路面上的6 組數據中可以看出,實際值與測量值的誤差較小,在10 m 內的誤差控制在200 mm 內,說明本文建立的車距測量模型較準確.在實際的高速路面上,安全車距不少于50 米,可以通過本文的算法設置固定的車距安全閾值來實現車距安全檢測.

表1 無人車相對于光軸的偏航角和車距測量表
由于無人車駕駛過程中容易出現偏航現象,如果不及時調整方向便會偏離到其他車道.此外,車輛壓到分道線導致左輪或者右輪偏離在其他車道中,將影響其他車輛的正常運行,甚至導致不可預知的交通事件,因此需要車道偏離提示.車輛準備超車時會提前打開左轉向燈,所以,無人車在沒有檢測到左轉向燈打開時,車道偏離報警系統才會發揮相應的警報作用.
無人車正常行駛時,行駛方向與左右分道線趨近平行,因而,可以利用車道俯視圖模型來計算出偏航的角度和車輛與左右分道的邊距,以做出相應的報警信息反饋.

CCP 算法需要預知無人車的橫向寬度bc和車道寬度bl,標準高速公路的車道寬度為3.75 m,可以通過式(6)判斷車道偏離情況.y0表示無人車中心與車道中線的距離.如果△y1<0 或△y2<0,則認為是車道偏離;如果 △y1>0 和△y2>0則認為是無人車在當前行駛的車道內.如果判別到無人車是左偏離,那么如圖6 所示,可知 △y1是 車輛與左分道線的距離,△y2是車輛與右分道線的距離;如果判別到無人車是右偏離,那么 △y1是車輛與右線的距離,△y2是車輛與左線的距離.

圖6 CCP 車道偏離檢測
相機的光心在圖像上的坐標為(u0,v0),因此圖像中坐標點Fo(u0,Ih)為相機光軸投影在地面上投影的點,Ih是圖像的高,Iw為圖像的寬.如圖7 所示,是一張車身右偏而行駛方向偏左的圖像,圖中L1和L2是左右車道線,L3是L1和L2交叉角的平分線,Pt(u,v)是L3上任意一點,L3與 圖像底邊的交點為V(u,v).

圖7 車向偏離示意圖
如圖8 所示,在路面上建立一個路面坐標,以分道線平行的中線為正向y軸,無人車所在的位置橫向為x軸,右方向為正,其中θ 是無人車的偏航角,∠FVoPo=φ,Ib是相機成像后靠近車輛的底邊,Vo、Po分別是圖像中V、Pt點的實際路面投影點,Po為隨機投影點,像素坐標中直線u=u0與車道平分線的交點投影在路面上,即是圖中Po點.

圖8 車輛偏離俯視圖模型
(1)無人車偏航角的計算
① 余太武[9]計算左右車道的角平分線作為車道中線,而本文計算車道中線的方法是基于左右車道斜率和截距求平均的方法.

如圖9 所示,基于角平分線求解車道中線的方法存在誤差,而基于式(7)求解的結果正確.

圖9 求解車道中線的比較
② 基于2.1 節介紹的路面建模圖像,我們隨機取車道中線上的某點Pt,接下來,計算出車道中線上V點坐標,分別計算出Fo, V,Pt,分別對應在路面上的F,Vo,Po點 ,以此計算出實際路面上的距離|FVo|、 |PoVo|和|FPo|.
根據余弦定理求∠FV0P0=φ:

③ 計算偏航角:
(2)無人車與左右分道線的距離計算
② 若Fo.u>V.u,可初步判斷為車輛向左偏離車道中線.
無人車距左分道線距離為:
無人車距右分道線距離:
③ 若Fo.u<V.u,可初步判斷為車輛右偏離車道中線
無人車距左分道線距離:

無人車距右分道線距離:

獲取到無人車與左右分道線的偏離距離和偏航角后,就可以設定相應的閾值來判斷當前無人車的行駛狀況.如圖10 所示,沿車道方向分割成安全區域和報警區域.對于一般小車寬度為1.5-1.8 m 之間,標準高速路寬度為3.7 m.本文設置車輛與左右分道線0.5 m范圍內為報警區,車道中間2.75 m 內為安全區.

圖10 車道安全區域與報警區域的劃分
如圖11 所示為兩幀車道偏離檢測結果,其中第1 行輸出為車輛左輪與左分道線的間距和右輪與右分道線的間距;第2 行輸出為車輛行駛方向與車道中線的偏航角,當偏航角小于5 度時表示行駛方向正常.第3 行表示車輛當前的運行狀態,只有當偏航角、無人車與左右分道線的間距不超過設定的安全閾值時才會斷定為正常行駛.

圖11 車道偏離檢測結果
如圖12 所示,本文實驗模擬的車道寬度為120 cm,車輛寬度為36 cm,相機投影在地面到圖像底邊的實際地面邊界的距離為205 cm,其高為70 cm,模擬得到的結果為表2 和表3.

圖12 模擬偏航試驗圖

表2 無人車相對于車道的偏航角(度)

表3 無人車與左右分道線距離
TI 公司的DM3730[10,11]整合了具有控制優勢的ARM 核和具有運算優勢的DSP 核.DSP 端依靠DSP/BIOS 操作系統來支持音視頻算法,ARM 端依靠Linux 系統來控制芯片的外部設備,而ARM 與DSP 雙核之間的數據傳輸與通信則依賴Codec Engine 架構來管理[12].ARM+DSP 框架如圖13 所示.

圖13 DSP+ARM 雙核框架
(1)處理器:DM3730 處理器.
① Pin-to-Pin 兼容DM3730 系列處理器.
② 1000-MHz 主頻ARM CortesxTM-A8 內核.
③ 800-MHz DSP TMS320C64x+TM 內核.
④ 片內集成存儲器用于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 接口、音頻插座、調試接口、SD/MMC 插座、電源接口、串口插座、擴展接口、網絡接口.
搭建軟件開發平臺的資源有:VirtualBox;uBuntu V10.04;PC 端的超級終端Tera Term Pro.
安裝TI 提供的支持音頻和視頻算法的DVSDK組件包,該包含有各算法支持庫和各支持庫的調用管理引擎(Code Engine),以及XDM 算法的編譯工具xdctools,同時提供了音頻、視頻算法進行編解碼的例程以供參考.利用該包可以很方便地開發DSP 下的圖像語音處理軟件,并且實現ARM 與DSP 之間的聯系.Codec Engine 是DVSDK 組件包的核心模塊,是ARM 和DSP 的通信與數據傳輸橋梁,過渡于ARM 應用層和DSP 信號處理層之間.該模塊要與DSP 端建立的Codec Engine 服務器進行通信需要使用DSP/BIOS、DSP Link、DSP 算法接口的標準xDIAS[13]和XDM 協議.為了發揮DM3730 的雙核作用,Codec Engine、DSP Link、xDIAS 和XDM 是軟件中不可缺少的部分.
DM3730 開發板可以從板載的NandFlash 中啟動,也可以從SD 卡的Fat32 分區中啟動.無論是從板載的NandFlash 中啟動還是從SD 卡啟動,都需要用XLoader對開發板進行一些初始化工作,接著從NandFlash/SD中讀取Uboot 程序到存儲器,然后Uboot 從NandFlash/SD卡讀入啟動參數,加載Linux 內核uImage 到存儲器,解壓縮后運行,直到Linux 內核啟動后,重新初始化DM3730 板,加載NandFlash/SD 卡上的FileSystem,執行FileSystem 中的程序并啟動控制臺.由此可見,開發板上的Xloader、Uboot、uImage 和文件系統在整個啟動過程是層層依賴的關系.
安裝DVSDK 組件包后有自帶的交叉編譯器—arm-arago-linux-gnueabi-gcc.只需將DVSDK 組件包中的交叉編譯器的安裝路徑添加在用戶目錄中的.bashrc文件中即可.
TFTP 網絡能將編譯的程序和數據燒寫到目標版上運行,或將目標版上文件或者運行結果上傳到Linux主機端.tftp 工作目錄在/tftpboot,在文件傳輸過程中,均需要先將文件拷貝到該目錄下,然后才能在超級終端Tera Term Pro 中使用以下命令實現uBuntu 和目標板中文件的傳輸:
(1)tftp -g -r fileName uBuntu 的IP 地址
(2)tftp -p -l fileName uBuntu 的IP 地址
(3)g:get,-r:remote,-p:put,-l:local
OpenCV 開源的視覺庫提供了豐富的圖像處理算法,在各大操作系統上均可編譯通過生成相應的執行文件,因此,這些代碼只要經過適當修改和編譯便可移植在嵌入式系統中.
EMCV 庫基于C 語言實現,能運行于TI DM64x系列DSP 中,移植EMCV 相當于把OpenCV 中少部分算法移植到DSP 中[14].
在DM3730 的ARM 應用程序中調用交叉編譯后的OpenCV 接口函數,而在DSP 端調用EMCV 接口函數.適用cmake 交叉編譯OpenCV 庫之前,需要編譯安裝ffmpeg 資源包、libx264 和libxvid 兩個庫、匯編編譯器yasm,以及libpng 和libjpeg 庫,OpenCV 才能讀取和顯示png 和jpeg 格式圖片,而libpng 庫的安裝依賴于zlib 庫.
所有庫的安裝目錄均設置在交叉編譯的目錄中,且將編譯安裝后的生成庫通過tftp 網絡傳送到目標板的lib 目錄上.至此,就可以實現在DM3730 目標板的ARM 端調用OpenCV 庫函數了.
本文使用Qt 開發圖形界面對處理后的視頻在LCD 上顯示.先在Qt 中的項目文件.pro 中添加OpenCV的頭文件路徑和庫文件.編譯后生成的二進制文件傳送到目標板的文件系統上就可以在ARM 端調用OpenCV 函數接口,處理后的結果使用Qt 來顯示.
使用Codec Engine 作為ARM 和DSP 的連接橋梁,模仿Codec Engine 自帶的video_copy 例程來添加算法.針對EMCV 的移植,將EMCV 的文件添加到video_copy 中,并在配置文件中添加EMCV 的文件名.車道識別和車輛檢測算法移植后,進而測試本文的車道偏離檢測和車距安全檢測算法,得到的效果良好.
TI 的DVSDK 組件包提供了Codec Engine 軟件模塊來實現ARM 和DSP 的通信和協同工作.Codec Engine 是一組應用程序編程接口,用于實例化和運行xDAIS 算法,還有VISA(Video,Image,Speech,Audio)接口,用于與xDM 兼容的xDAIS 算法進行交互[15,16],使ARM 端的Linux 可以調用VISA 標準接口來管理ARM 與DSP 的軟件.如圖14 所示,Codec Engine 框架中,Server 集成Codec 端算法,DSPLink 模塊隱藏了APP 調用Server 端算法的整個過程,因此在實例應用中只能看到Server 和APP 端.

圖14 ARM 與DSP 的通信框架
如圖15 所示,ARM 應用程序調用Codec Engine的VISA API 接口,VIDENC_process(a,b,c)傳遞a,b,c參數,Codec Engine 的stub 會把參數a,b,c以及VISA 接口信息封裝處理,利用消息隊列msgq 傳遞給DSP 端.DSP 端的skeleton 解開這個封裝包,把ARM端的參數a,b,c(虛擬地址)轉換成DSP 端的參數x,y,z(物理地址).DSP 端的處理process 中的請求即能實現ARM 端VIDENC_process(a,b,c)函數的操作[17,18].

圖15 ARM 和DSP 通信的函數傳遞
圖16 為本文算法移植在DM3730 平臺上的運行結果.已知采集高速車道視頻的相機內外參,使用本文的車距模型和車道偏離模型,計算的車距和車道偏離角度均顯示在圖片上.車輛正常行駛拍攝到的視頻得到的檢測結果良好.

圖16 本文算法在DM3730 平臺上的運行結果圖
本文的車距檢測模型[19],不但能夠檢測前方車輛與無人車的距離,還能計算出前方車輛相對于相機光軸的偏轉角度.基于CCP 車道偏離算法,建立車道偏離模型,實現了無人車當前位置和相對于分道線的偏航角的計算,并設定無人車在車道上的安全區和警報區實現車道偏離的及時報警.對于車距的建模,在實驗室模擬車道計算路面上的隨機點,得到的誤差較小,穩定性較好.對于車道偏離檢測,模擬高速路車道搭建車道偏離模型,計算車輛偏離車道的偏航角且車輛與左右分道線的距離,檢測誤差范圍小,準確性較高.還使用運行狀況良好的高速路視頻測試本文算法,偏離反饋均顯示正常.盡管本文采用先進的ARM+DSP 框架實現車輛動態圖像識別的系統設計,且采用Codec Engine 框架實現ARM 和DSP 的通信,實驗過程穩定性較高,但是在嵌入式平臺內存和運行主頻有限且運行算法尚未優化的情況下難以實現算法的實時性處理,因此有待完善運行平臺,更好地協調車道檢測、車輛檢測與跟蹤、車道偏離檢測和車距檢測4 個模塊.有待進一步使用本文的算法在路面上測試.