李鵬 趙天垚
摘要:文章采用車輛全景視圖拼接技術(shù)與3D車道線檢測技術(shù)來實現(xiàn)車輛行駛過程中,對車道線進行識別,并判斷車輛是否在車道線范圍內(nèi)行駛(是否壓線),同時結(jié)合車載雷達自動規(guī)避障礙物的需求。利用車輛全景視圖拼接技術(shù),將車輛上所有攝像頭的圖像進行拼接與變換,最終轉(zhuǎn)換到全景的鳥瞰圖下進行顯示。利用車道線檢測技術(shù)可以識別車身周圍的車道線,并判斷車輛的行駛狀況和是否壓線。最終可以滿足車輛全景可視與智能化的需求。
關(guān)鍵詞:校園安防;全景視圖;車載可視化
中圖分類號:TP393? ? ? ? 文獻標(biāo)識碼:A
文章編號:1009-3044(2023)35-0113-05
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID)
1 研究現(xiàn)狀
1.1 車載環(huán)視圖拼接
車載環(huán)視圖拼接技術(shù)是一種車載多攝像頭系統(tǒng),它可以將車輛周圍的多個攝像頭的視頻流拼接成一個全景圖像,以提供更好的駕駛體驗和安全性。目前,車載環(huán)視圖拼接技術(shù)已經(jīng)得到了廣泛應(yīng)用,例如在無人駕駛、智能交通、智能網(wǎng)聯(lián)汽車等領(lǐng)域。目前,車載環(huán)視圖拼接技術(shù)的研究主要集中在算法優(yōu)化、硬件設(shè)計、標(biāo)定方法等方面。
根據(jù)車輛的大小設(shè)計4個魚眼攝像頭。在獲得每個攝像機的圖像后,需要通過特定的算法來處理圖像,將每個通道的圖像合成在一個坐標(biāo)系中。同時每個圖像通過車載雷達來避開障礙物識別路上的標(biāo)線[1]。
日本一家公司早年研發(fā)了一個名為Around View Monitor(AVM) 的全景影像系統(tǒng)。這套系統(tǒng)采用的是 4 個普通的攝像頭來獲取圖像,但是此系統(tǒng)并沒有對圖像合成建立細致的模型,只是將圖像拼接后改為俯視效果,再按照攝像機的位置對應(yīng)展現(xiàn),如圖1所示,存在的問題都是每個攝像頭結(jié)合處都有一條明顯的縫隙。
后期日本豐田汽車公司研發(fā)了名為 PVM的全景視頻系統(tǒng),系統(tǒng)在調(diào)整攝像機安裝位置時,攝像機之間有重疊部分,最終全景效果要比AVM系統(tǒng)更好,同時消除了攝像機之間的接縫。
隨后,相關(guān)領(lǐng)域的工程師設(shè)計了基于DSP技術(shù)、魚眼攝像頭的拼接系統(tǒng)。經(jīng)過不斷的技術(shù)革新,對多攝像頭的圖像拼接正確率進行了優(yōu)化改進,但是大多數(shù)全景圖像效果仍然差強人意。
1.2 車道線檢測
車道線檢測技術(shù)是自動駕駛技術(shù)中的一個重要模塊,它可以通過攝像頭獲取道路上的車道線信息,以幫助車輛實現(xiàn)自動駕駛。通過建立一定的數(shù)學(xué)模型便可以讓安防小車準(zhǔn)確識別標(biāo)志線,并實現(xiàn)車道保持行駛。
2D車道線檢測檢測圖像平面中的車道線,并用相機位姿將它們投影到3D空間。一般來說,先進的單目車道線檢測器可以分為分割方法和回歸方法。
SCNN將傳統(tǒng)的深層逐層卷積推廣到特征圖中的切片逐層卷積,實現(xiàn)一層中跨行和列的像素之間的消息傳遞。LaneNet介紹了一種用于目標(biāo)檢測的實例分割方法,該方法結(jié)合了二進制分割分支和嵌入分支。SAD 允許目標(biāo)檢測網(wǎng)絡(luò)加強本身的表示學(xué)習(xí),無需額外的標(biāo)簽和外部監(jiān)督。RESA通過反復(fù)移動切片的特征圖來聚合垂直和水平方向上的信息。
車道回歸算法可以分為關(guān)鍵點估計、基于錨點的回歸和逐行回歸。PINet結(jié)合了關(guān)鍵點估計和實例分割,GANet將車道表示為一組只與起點相關(guān)的關(guān)鍵點。PointLaneNet和CurveLaneNAS將圖像分成不重疊的網(wǎng)格,并根據(jù)垂直錨點回歸車道。Line-CNN和LaneATT在預(yù)定義的射線錨上回歸車道,而CLRNet通過金字塔特征動態(tài)細化射線錨的起點和角度。UltraFast引入了一種新的行分類方法,具有顯著的速度。Laneformer應(yīng)用行列自注意力來適應(yīng)傳統(tǒng)的Transformer來捕獲車道的形狀特征和語義上下文。
除了點回歸外,多項式回歸也是2D車道檢測任務(wù)的一種方法。PolyLaneNet 使用全連接層直接預(yù)測圖像平面中車道的多項式系數(shù)。PRNet將車道檢測分解為多項式回歸、初始分類和高度回歸三部分。LSTR引入了一種基于Transformer 的網(wǎng)絡(luò)來預(yù)測反映道路結(jié)構(gòu)和相機姿勢的路參數(shù)。
3D車道線檢測最近引起了比2D車道線檢測更多的關(guān)注,原因是后者缺乏深度信息和空間變換的結(jié)果存在錯誤傳播問題。3DLaneNet是一種基于網(wǎng)絡(luò)內(nèi)逆透視映射和基于錨的視覺表示的雙路徑架構(gòu)。3D-LaneNet+將Bev特征劃分為不重疊的單元,并通過回歸相對于單元中心、線角和高度偏移的橫向偏移距離來檢測通道。Gen-LaneNet首先在虛擬頂部視圖坐標(biāo)幀而不是自我車輛坐標(biāo)幀中引入新的數(shù)學(xué)幾何引導(dǎo)的車道錨點,同時引用既定的數(shù)值幾何轉(zhuǎn)換直接計算網(wǎng)絡(luò)輸出的 3D 車道線點。CLGo用Transformer替換CNN主干來預(yù)測相機姿勢和多項式參數(shù)。Persformer構(gòu)建了一個具有已知相機姿勢的密集Bev查詢,并在一個框架下統(tǒng)一了2D和3D邊緣檢測。
2 實現(xiàn)過程
首先需要在車身周圍安裝足夠數(shù)量的魚眼相機(以8個為例),使得每相鄰兩個相機之間具有重合區(qū)域。具體的系統(tǒng)處理流程圖如圖2所示:
2.1 魚眼相機畸變矯正
魚眼攝像頭的成像模型可轉(zhuǎn)化為單位球面投影模型。一般將魚眼攝像頭成像過程分解成2步:先將立體空間的坐標(biāo)點線性的投影到虛擬球面上;再將虛擬球面上的點非線性地投影到水平圖像層[2]。
魚眼攝像頭合成圖像存在畸變,而且畸變主要為徑向畸變。
魚眼攝像頭的成像過程如圖3所示。實驗過程中發(fā)現(xiàn),魚眼攝像頭生產(chǎn)過程中不能精確地設(shè)計投影模型,為了解決魚眼相機的標(biāo)定難題,Kannala-Brandt提出了一般多項式近似模型。[θd]是[θ]的奇函數(shù),將這些式子按泰勒級數(shù)展開,[θd]用[θ]的奇次多項式表示,即:
[θd=k0θ+k1θ3+k2θ5+...]
取前5項,給出了足夠的自由度來很好的近似各種投影模型:
[θd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9]
下面給出空間點到圖像的投影過程。假設(shè)[P=(X, Y, Z)]為世界坐標(biāo)系下一個三維坐標(biāo)點,變換到相機坐標(biāo)系下為[(XC, YC, ZC)]:
[XCYCZC=RXYZ+T]
轉(zhuǎn)換到相機坐標(biāo)系下歸一化坐標(biāo)點:
[x=XCZCy=YCZC]
計算[θ]角:
[r=x2+y2θ=atan(r,)]
根據(jù)直角三角形的正切計算公式可以推斷。r為物體通過魚眼鏡頭投放在虛擬平面的像高,即物體中像素點到主點的距離。
利用KB畸變模型進行加畸變優(yōu)化處理:
[θd=θ(k0+k1θ2+k2θ4+k3θ6+k4θ8)]
計算該點在圖像物理坐標(biāo)系中的坐標(biāo):
[x'=(θd/r)xx'=(θd/r)y]
最終得到圖像像素坐標(biāo):
[u=fx(x'+αy')+cxv=fyy'+cy]
[α]是扭曲系數(shù),[fx]、[fy]、[cx]、[cy]是魚眼鏡頭的內(nèi)參矩陣。
接下來介紹去畸變的過程。首先獲取每個相機的內(nèi)參矩陣與畸變系數(shù)。在地面上鋪上一張標(biāo)定布,并獲取各路視頻的圖像,利用標(biāo)定物來手動選擇對應(yīng)點獲得投影矩陣,如圖4所示。
魚眼相機去畸變問題一般使用張正友棋盤格標(biāo)定法,首先通過矩陣推導(dǎo)獲得一個初始值,最后通過非線性優(yōu)化獲取最優(yōu)解,包括魚眼相機的內(nèi)外參數(shù)、畸變系數(shù),然后針對圖像做去畸變處理。
優(yōu)化后的圖像可以發(fā)現(xiàn)圖像較為自然,畸變優(yōu)化明顯。噪點較少、4個攝像頭成像后的邊界交匯點無黑線,如圖5所示。
2.2 多路攝像頭聯(lián)合標(biāo)定
至此需要獲取每個相機到地面的投影矩陣,此模型會把攝像機校正后的畫面轉(zhuǎn)換為對投影圖上某個矩形區(qū)域的俯視圖。然后通過聯(lián)合標(biāo)定的形式在巡邏車四周的攝像頭下擺放標(biāo)定物,截取圖像手動獲得標(biāo)定點,計算投影矩陣。
2.3 多攝像機投影變換
相機從2個不同的角度拍攝同一個平面,兩個相機拍攝到的圖像之間投影變換矩陣H(單應(yīng)矩陣)為:
[H=K(R+T1dNT)K-1]
其中,K為相機內(nèi)參矩陣,R、T為兩個相機之間的外參。
2.4 鳥瞰圖的拼接與平滑
將各路魚眼相機拍攝到的圖像,投影到汽車正上方平行于地面拍攝的相機平面上,從而得到鳥瞰圖。
然而,由于相機之間有重疊的區(qū)域,通過簡單的加權(quán)平均會導(dǎo)致拼接結(jié)果出現(xiàn)亂碼和重影,如圖6所示。
需要進行平滑處理。先取出投影重疊部分,進行灰度化和二值化處理,利用形態(tài)學(xué)方法去掉噪點,得到重疊區(qū)域的mask。最后將mask加入拼接當(dāng)中[3-6]。
2.5 3D車道線檢測
對于車道線檢測,考慮采用基于深度學(xué)習(xí)的檢測方法。首先采集數(shù)據(jù),獲取各路視頻的圖像數(shù)據(jù),并進行標(biāo)注,得到訓(xùn)練數(shù)據(jù)集。在數(shù)據(jù)集上訓(xùn)練深度學(xué)習(xí)模型,該模型可以端到端地輸出檢測到的車道線信息,如圖7所示。
3 程序?qū)崿F(xiàn)部分
通過Python實現(xiàn)環(huán)視系統(tǒng)中相機的安裝位置標(biāo)定、透視變換,同時使用OpenCV技術(shù)在AGX Xavier的無線控制車上實現(xiàn)。
小車上搭載了4個 USB 環(huán)視魚眼攝像頭,相機傳回的畫面分辨率為 640×480,圖像首先經(jīng)過畸變校正,然后在射影變換下轉(zhuǎn)換為對地面的鳥瞰圖,最后拼接起來,經(jīng)過平滑處理后得到了圖8的效果。全部過程在 CPU中進行處理,整體運行流暢。
系統(tǒng)的若干約定。為了方便起見,筆者對4個攝像機分別用front、back、left、right來代表,并假定其對應(yīng)的設(shè)備號是整數(shù),例如0、1、2、3相機的內(nèi)參矩陣記做camera_matrix,這是一個3×3的矩陣?;兿禂?shù)記做dist_coeffs,這是一個1×4的向量。相機的投影矩陣記作project_matrix,這是一個3×3的射影矩陣。
獲得原始圖像與相機的內(nèi)參步驟。首先需要獲取每個相機的內(nèi)參矩陣與畸變系數(shù)。通過運行腳本run_calibrate_camera.py,告訴它相機設(shè)備號,是否魚眼相機,以及標(biāo)定板的網(wǎng)格大小,然后手舉標(biāo)定板在相機面前擺幾個姿勢即可。以下是視頻中4個相機分別拍攝的原始畫面,順序依次為前、后、左、右,并命名為front.png、back.png、left.png、right.png保存在項目的images/ 目錄下。
4 個相機的內(nèi)參文件分別為ront.yaml、back.yaml、left.yaml、right.yaml,這些內(nèi)參文件都存放在項目的yaml子目錄下??梢钥吹剑瑘D中地面上鋪了一張標(biāo)定布,這個布的尺寸是? 6m×10m,每個黑白方格的尺寸為40cm×40cm,每個圓形圖案所在的方格是80cm×80cm。將利用這個標(biāo)定物來手動選擇對應(yīng)點獲得投影矩陣。
設(shè)置投影范圍和參數(shù)。接下來需要獲取每個相機到地面的投影矩陣,這個投影矩陣會把相機校正后的畫面轉(zhuǎn)換為對地面上某個矩形區(qū)域的鳥瞰圖。這4個相機的投影矩陣不是獨立的,它們必須保證投影后的區(qū)域能夠正好拼起來。這一步是通過聯(lián)合標(biāo)定實現(xiàn)的,即在車的四周地面上擺放標(biāo)定物,拍攝圖像,手動選取對應(yīng)點,然后獲取投影矩陣。如圖9所示,首先在車身的4角擺放4個標(biāo)定板,標(biāo)定板的圖案大小并無特殊要求,只要尺寸一致,能在圖像中清晰看到即可。每個標(biāo)定板應(yīng)當(dāng)恰好位于相鄰的兩個相機視野的重合區(qū)域中。
在上面拍攝的相機畫面中,車的四周鋪了一張標(biāo)定布,這個具體是標(biāo)定板還是標(biāo)定布不重要,只要能清楚地看到特征點即可。
然后需要設(shè)置幾個參數(shù)(如圖10所示):
innerShiftWidth ,? innerShiftHeight :標(biāo)定板內(nèi)側(cè)邊緣與車輛左右兩側(cè)的距離,標(biāo)定板內(nèi)側(cè)邊緣與車輛前后方的距離。
shiftWidth , shiftHeight :這兩個參數(shù)決定了在鳥瞰圖中向標(biāo)定板的外側(cè)能看多遠。這2個值越大,鳥瞰圖的范圍就越大,相應(yīng)的,遠處的物體被投影后的形變也越嚴重,所以應(yīng)酌情選擇。
totalWidth ,? totalHeight :這2個參數(shù)代表鳥瞰圖的總寬高,在這個項目中,標(biāo)定布寬 6m,高10m,于是鳥瞰圖中地面的范圍為 (600 + 2 * shiftWidth, 1000 + 2 * shiftHeight) 。為方便計算,讓每個像素對應(yīng)1cm,于是鳥瞰圖的總寬高為:
totalWidth = 600 + 2 * shiftWidth
totalHeight = 1000 + 2 * shiftHeight
車輛所在矩形區(qū)域的四角 (圖中標(biāo)注的紅色圓點),這4個角點的坐標(biāo)分別為 (xl, yt) ,? (xr, yt) ,(xl, yb) ,? (xr, yb) ( l表示 left, r表示right,t表示top,b表示 bottom)。這個矩形區(qū)域相機是看不到的,用一張車輛的圖標(biāo)來覆蓋此處。
注意這個車輛區(qū)域四邊的延長線將整個鳥瞰圖分為前左 (FL)、前中 (F)、前右 (FR)、左 (L)、右 (R)、后左(BL)、后中 (B)、后右 (BR) 8個部分,其中 FL (區(qū)域 I)、FR (區(qū)域 II)、BL (區(qū)域 III)、BR (區(qū)域 IV) 是相鄰相機視野的重合區(qū)域,也是重點需要進行融合處理的部分。**F、R、L、R** 4個區(qū)域?qū)儆诿總€相機單獨的視野,不需要進行融合處理。以上參數(shù)存放在 param_settings.py 中。
設(shè)置好參數(shù)以后,每個相機的投影區(qū)域也就確定了,比如前方相機對應(yīng)的投影區(qū)域如圖11所示,接下來需要通過手動選取標(biāo)志點來獲取地面的投影矩陣。
隨之需要確定以下參數(shù):
-camera : 指定是哪個相機。
-scale : 校正后畫面的橫向和縱向放縮比。
-shift : 校正后畫面中心的橫向和縱向平移距離。
因為默認的 OpenCV 的校正方式是在魚眼相機校正后的,圖像裁剪出一個 OpenCV “認為”合適的區(qū)域并將其返回,這必然會丟失一部分像素,可能會把希望選擇的特征點裁掉。新的內(nèi)參矩陣,對校正后但是裁剪前的畫面作一次放縮和平移??梢試L試調(diào)整并選擇合適的橫向、縱向壓縮比和圖像中心的位置,使得地面上的標(biāo)志點出現(xiàn)在畫面中舒服的位置上,以方便進行標(biāo)定。標(biāo)定完成后圖像如圖12所示。
然后依次點擊事先確定好的4個標(biāo)志點,如圖13所示。
這4個點是可以自由設(shè)置的,但是需要在程序中手動修改它們在鳥瞰圖中的像素坐標(biāo)。當(dāng)在校正圖中點擊這4個點時,OpenCV 會根據(jù)它們在校正圖中的像素坐標(biāo)和在鳥瞰圖中的像素坐標(biāo)的對應(yīng)關(guān)系計算一個射影矩陣。這里用到的原理就是4點對應(yīng)確定一個射影變換 (4點對應(yīng)可以給出8個方程,從而求解出射影矩陣的8個未知量。注意射影矩陣的最后一個分量總是固定為 1) 。顯示投影后的效果圖14所示。
標(biāo)定最后的實現(xiàn)效果如圖15所示。
4 總結(jié)
本項目設(shè)計了一個校園安防檢測智能車全景可視與智能化系統(tǒng),包括車輛全景視圖拼接與3D車道線檢測。首先需要在車輛四周安裝足夠的魚眼相機,保證范圍的全覆蓋以及相鄰相機之間存在重合區(qū)域;對于每個相機,進行相機內(nèi)參標(biāo)定以完成去畸變過程,并依次進行相機聯(lián)合標(biāo)定、投影變換、鳥瞰圖拼接與平滑,得到車輛全景的鳥瞰圖。最后采集數(shù)據(jù)訓(xùn)練端到端的3D車道線檢測模型,實現(xiàn)對車道線的檢測。
參考文獻:
[1] 趙小松.全景泊車輔助系統(tǒng)的算法研究[D].西安:西安電子科技大學(xué),2015.
[2] 楊前華,李尤,趙力.基于改進球面投影模型的魚眼圖像校正算法的研究[J].電子器件,2019,42(2):449-452.
[3] 張東,余朝剛.基于特征點的圖像拼接方法[J].計算機系統(tǒng)應(yīng)用,2016,25(3):107-112.
[4] 劉敏,周聰,湯靖博.基于SIFT圖像配準(zhǔn)算法優(yōu)化研究[J].湖北工業(yè)大學(xué)學(xué)報,2020,35(2):32-36.
[5] 吳樂富,丁廣太.基于區(qū)域的圖像拼接算法[J].計算機工程與設(shè)計,2010,31(18):4044-4046,4050.
[6] 何惠洋.車載全景環(huán)視系統(tǒng)中的圖像拼接技術(shù)研究[D].西安:西安工業(yè)大學(xué),2020.
【通聯(lián)編輯:唐一東】