黃思曉
(南方科技大學(xué)深港微電子學(xué)院 廣東省深圳市 518055)
這個系統(tǒng),需要同時使用四路的魚眼攝像頭的輸入圖片,結(jié)果矯正,轉(zhuǎn)化,拼接等操作,計算量較大,需要選用性能較強的處理器,所以我們主要挑選了樹莓派和STM32;
由于需要實現(xiàn)目標(biāo)識別,神經(jīng)網(wǎng)絡(luò)算法必不可少。當(dāng)下神經(jīng)網(wǎng)絡(luò)的框架主要是使用python 語言編寫,所以我們使用可以用python 編寫的程序的樹莓派;
需要用4 路的魚眼攝像頭獲取廣角照片,我們選擇了USB 接口魚眼攝像頭。
由于樹莓派的算力有限,為了防止最后形成的2D 地圖刷新率過低,我們最終采用不在樹莓派上處理圖片和進(jìn)行地圖的映射,相關(guān)計算量過大的任務(wù)交給筆記本電腦進(jìn)行,這樣不僅可以減小樹莓派的壓力,還可以提高2D 地圖和全景照片實時反映車周邊情況的能力。
對于魚眼攝像頭拍攝的照片進(jìn)行矯正前,需要獲得相機的畸變參數(shù),而測量相機的畸變參數(shù)的方法主要有兩種,一種是用opencv的矯正方法,一種是調(diào)用Matlab 中的Camera Calibrator 模塊的矯正方法,我們分別對是用兩種測量方法,并用獲得的參數(shù)對照片進(jìn)行矯正,最終發(fā)現(xiàn)opencv 的方法矯正的過程較為復(fù)雜,而且最終的效果的誤差超出了預(yù)期結(jié)果,最終采用了Matlab 中的Camera Calibrator 模塊獲得的相機參數(shù)。
對魚眼攝像頭拍攝的超廣角照片進(jìn)行矯正的方法主要有兩種:棋盤矯正法,經(jīng)緯度矯正法。我們分別對兩種對魚眼照片矯正畸變的效果,發(fā)現(xiàn)兩種方法在視野中心矯正效果相似,但在照片周邊棋盤矯正法更為優(yōu)秀,所以選擇了棋盤矯正法。
在目標(biāo)識別方面,存在三種網(wǎng)絡(luò)的形式:tiny,GPU 和CPU 版本。Tiny 版本網(wǎng)絡(luò)較小,可識別的物體有限,準(zhǔn)確率較低,但是運行速度快;CPU 版本主要是使用CPU 運行,GPU 版本是使用GPU 運行。本系統(tǒng)選擇可以使用GPU 加速的GPU 版本。
在測距方面,現(xiàn)在主要有單目測距和雙目測距兩種方式。單目測距需要事先建立數(shù)據(jù)集,提前錄入目標(biāo)的大致尺寸;雙目測距需要同時調(diào)用兩個攝像頭對目標(biāo)進(jìn)行測距,需要進(jìn)行標(biāo)定等操作。由于需要保證小車360 度范圍內(nèi)每處都有兩個攝像頭同時觀測,對于每個視角160 度的魚眼攝像頭比較困難,最后選擇了較為簡單的單目測距的方案。
圖1:可行駛區(qū)域的識別
通過四路魚眼攝像頭,可以分別獲得車身四個方向的圖像,通過圖像拼接技術(shù)最終得到小車的360°全景圖像。同時可以獲得車身周圍的鳥瞰圖,俯視汽車可以更清晰的觀察車身周圍的情況。
四路魚眼攝像頭擁有更大的視角,因此可以容易獲得倒車時車身周圍的信息,通過魚眼攝像頭獲得的圖像進(jìn)行軟件上的處理可以識別出停車的具體方位,同時可以實時檢測到車后方的障礙物信息,例如:車輛、行人、動物、基礎(chǔ)設(shè)施、交通工具等。在檢測到障礙物時可以返回到輸出的2D 地圖上,給駕駛員及時的提醒。在進(jìn)行倒車的時候,受限于旁邊車輛的干擾,魚眼攝像頭可以及時捕捉該信息并且反映到2D 地圖上,可以在地圖上標(biāo)明車輛的可行使區(qū)域,并給予駕駛員一定的輔助。因此會在2D 地圖上展示指引標(biāo)識,指引駕駛員進(jìn)行最優(yōu)的操作。
4 路魚眼攝像頭得到的視頻可以被儲存到系統(tǒng)之中,類似于行車記錄儀,可以在發(fā)生意外的時候讀取倒車時的視頻進(jìn)行發(fā)生意外的責(zé)任判定。
由于樹莓派算力的原因以及攝像頭像素的限制,最終可以獲得1280×720 分辨率的圖片,經(jīng)過魚眼攝像頭去畸變的過程,應(yīng)用圖像拼接技術(shù)可以最終獲得1280×720 分辨率的全景圖片,圖片包含車身周圍360°的全部景象,并實時根據(jù)車輛位置進(jìn)行更新。
鳥瞰圖覆蓋的范圍,2D 地圖可以毫秒級進(jìn)行數(shù)據(jù)更新,在硬件限制的情況下可以做到最低延遲。同時,在單目測距算法的加持下,顯示障礙物的位置坐標(biāo)誤差在5%以內(nèi)。
基于四路魚眼攝像頭的拍攝,可以保存的視頻以供駕駛員需要時獲取。
單目測距主要是通過建立一對相似三角形來進(jìn)行測距,目標(biāo)的像素高度為x,目標(biāo)實際高度為X,所以由相似三角形可得,由此進(jìn)而計算物體距離車的距離。測距程序會讀取目標(biāo)識別程序輸出的結(jié)果,在已設(shè)置的數(shù)據(jù)集中查找識別的物體的實際尺寸,進(jìn)而利用上面的公式進(jìn)行計算,之后用相關(guān)的圖片映射到二維地圖的相關(guān)坐標(biāo)。
魚眼鏡頭通過光學(xué)的設(shè)計,可以做到接近180°視場角。本設(shè)計購買的相機支持160°。但由于視場角的增大,在圖像遠(yuǎn)離中心的地方會出現(xiàn)不同程度的畸變,離中心點越遠(yuǎn)畸變越明顯。
常見的魚眼圖像矯正方法有兩種,一是基于經(jīng)緯度矯正法,另一種是棋盤矯正法。本設(shè)計嘗試兩種矯正方式后,發(fā)現(xiàn)棋盤法矯正效果較佳,故選擇棋盤法進(jìn)行魚眼矯正。
本設(shè)計的圖像拼接基于特征點提取和匹配。本設(shè)計采用SURF特征點提取算法。SURF,加速穩(wěn)健特征,是一種穩(wěn)健的局部特征點檢測和描述算法。與Sift 算法一樣,Surf 算法的基本路程可以分為三大部分:局部特征點的提取、特征點的描述、特征點的匹配。
Surf 改進(jìn)了特征的提取和描述方式,用一種更為高效的方式完成特征的提取和描述,具體實現(xiàn)流程如下:
(1)構(gòu)建Hessian(黑塞矩陣),生成所有的興趣點,用于特征的提??;
(2)構(gòu)建尺度空間;
(3)特征點定位;
(4)特征點主方向分配;
(5)生成特征點描述子;
(6)特征點匹配。
黑塞矩陣(Hessian Matrix)是一個多元函數(shù)的二階偏導(dǎo)數(shù)構(gòu)成的方陣,描述了函數(shù)的局部曲率。由德國數(shù)學(xué)家Ludwin Otto Hessian 于19 世紀(jì)提出。
對一個圖像f(x,y),其Hessian 矩陣如下:
在構(gòu)造Hessian 矩陣前需要對圖像進(jìn)行高斯濾波,經(jīng)過濾波后的Hessian 矩陣表述為:
當(dāng)Hessian 矩陣的判別式取得局部極大值時,判定當(dāng)前點是比周圍鄰域內(nèi)其他點更亮或更暗的點,由此來定位關(guān)鍵點的位置。
Hessian 矩陣判別式中的f(x,y)是原始圖像的高斯卷積,由于高斯核實服從正態(tài)分布的,從中心點往外,系數(shù)越來越低,為了提高運算速度,Surf 使用了盒式濾波器來近似替代高斯濾波器,所以在Dxy 上乘了一個加權(quán)系數(shù)0.9,目的是為了平衡因使用盒式濾波器近似所帶來的誤差。盒式濾波器對圖像的濾波轉(zhuǎn)化成計算圖像上不同區(qū)域間像素和的加減運算問題,這正是積分圖的強項,只需要簡單幾次查找積分圖就可以完成。
首先我們使用opencv 中的SURF 算法,獲取圖像中的特征點,然后使用KNN 算法獲取匹配的特征點,最后經(jīng)過透視矩陣變換得到拼接后的全景圖像。由于拍攝時使用的攝像頭以及光線存在差異,最后合成的圖片會出現(xiàn)明暗差異,所以最后會對全景圖片做色彩均衡化減小全局色差。
本設(shè)計選用YOLOV4 識別網(wǎng)絡(luò),相比R-CNN 算法,其是一個統(tǒng)一的框架,其速度更快,而且Yolo 的訓(xùn)練過程也是端到端的。
本項目使用4 路USB160°魚眼攝像頭采集視頻信號。使用攝像頭最高支持1280×720 分辨率,但實際項目測試中需要降低分辨率以提高程序執(zhí)行的速度。
本項目采用樹莓派4B 作為四路視頻采集設(shè)備。樹莓派4B 配置了兩個USB2.0 和兩個USB3.0 接口。
由于樹莓派要帶動四路USB 魚眼攝像頭,為了滿足攝像頭的供電充足我們選擇了可以提供5V3A 功率的充電寶作為供電端。同時對小車的供電我們采用兩節(jié)5 號電池進(jìn)行供電。
圖2:2D 地圖
本項目采用自主設(shè)計的智能小車,通過Arduino 控制電極工作來實現(xiàn)小車的前進(jìn)后退以及左右轉(zhuǎn)彎,基本滿足模擬現(xiàn)實汽車的行駛的基本要求。同時,在小車的合理位置放置了樹莓派、4 個魚眼攝像頭以及供電模塊。
首先在樹莓派中通過Opencv 調(diào)取攝像頭進(jìn)行拍照。其次通過樹莓派的Wi-Fi 傳輸將獲取的圖片上傳到計算機進(jìn)行下一步的計算。用Opencv 對獲得的圖像進(jìn)行畸變的矯正,然后通過調(diào)用YOLO v4庫進(jìn)行圖像的識別,分別獲取障礙物的位置信息和標(biāo)志物的位置信息。最后將圖像拼接到一起得到全景圖像。
在有限的空間下,在小車上放置樹莓派、四路攝像頭、驅(qū)動電機、Arduino、樹莓派供電裝置(充電寶)、以及給小車和Arduino 供電的兩節(jié)5 號電池。大量走線都隱藏在小車內(nèi)部,以及外殼內(nèi)部。整體上看小車結(jié)構(gòu)緊湊,重量分布均勻,同時也能滿足攝像頭拍攝小車四周的要求,可以得到規(guī)定范圍內(nèi)的圖像。
將小車放置在設(shè)定的場景中,在小車周圍擺放人、動物、自行車、汽車等障礙物。小車保持不動,在靜態(tài)下開啟系統(tǒng),最后可以得到對應(yīng)的2D 地圖信息以及全景地圖。
通過遙控器控制小車在可行駛區(qū)域進(jìn)行行駛,將各障礙物擺放在小車運動的軌跡上。在小車行駛過程中可以實時檢測障礙物位置并反饋到2D 地圖上,同時也可以實時得到全景地圖,最后也可以調(diào)用小車運行時的錄像,起到倒車記錄儀的作用。
首先進(jìn)行魚眼鏡頭畸變的標(biāo)定,運用Matlab 自帶程序庫識別魚眼攝像頭捕捉的固定棋盤圖像,最后完成畸變的標(biāo)定,為畸變的矯正提供數(shù)據(jù)的支持。其次進(jìn)行鳥瞰圖識別的測試,在小車四周擺放棋盤圖像。用自寫代碼分別識別四個方向的區(qū)域范圍,完成鳥瞰圖的拼接。最后進(jìn)行單目測距的測試,用魚眼攝像頭獲取一把尺子的完整圖像,通過對應(yīng)像素點和絕對長度的關(guān)系,來算出單目測距所需要的系數(shù)。
在地面規(guī)劃出小車的可行駛區(qū)域,并且在邊界位置貼上黑線作為警示。在可行使區(qū)域內(nèi)擺放障礙物圖片供小車識別。
通過遙控器控制小車,測試紅外線遙控器控制小車能否正常運轉(zhuǎn)。之后測試小車上安裝的魚眼攝像頭可以正常工作,并且返回圖片和視頻可以被接收。
通過matlab 可以得到鏡頭的內(nèi)參矩陣、切向畸變以及橫向畸變。我們所使用的魚眼攝像頭有很少的切向畸變,但是有顯著的橫向畸變。
很明顯的看出,圖1 中可以完美的識別可行駛區(qū)域的范圍,并且重合率接近100%,對簡單的直線型停車線識別的準(zhǔn)確率幾乎可以達(dá)到100%。
通過圖2 可以看出具體障礙物的坐標(biāo)并將其標(biāo)識在2D 地圖上,并且在2D 地圖上右側(cè)可以返回四路的鳥瞰圖,在2D 地圖的右上角可以進(jìn)行選擇全景地圖、倒車記錄和鳥瞰圖的查看。
通過上述測試數(shù)據(jù)最終可以得到一個較為完整的輔助停車系統(tǒng),整體可以實時返回障礙物的坐標(biāo),并且也可以比較清晰的返回鳥瞰圖和全景地圖,同時也能保存倒車時的影像,可以在必要時調(diào)用查看。
(1)實現(xiàn)魚眼圖像矯正,使超廣角照片畸變更小,更接近于人眼直接觀看的效果;
(2)使用矯正后的照片進(jìn)行360 度全景圖像拼接,并實時形成汽車四周的鳥瞰圖,使泊車輔助效果更好;
(3)對交通目標(biāo)(人,汽車,狗,自行車,車道等)進(jìn)行識別,對識別的目標(biāo)進(jìn)行測距,實時反饋到2D 地圖上,使對障礙物的觀察更加直觀;
(4)保存停車視頻歷史記錄,方便事后回放復(fù)盤。