鄭文玲,錢宏文,盧思翰,倪文龍
(中國電子科技集團公司第58 研究所,無錫 214035)
隨著全球汽車電子產業以及智能交通科技的快速發展,自2006年全景輔助泊車概念提出來以后,全景技術成為各大汽車廠商以及科研單位的一大研究熱點[1].全景視頻成像系統是在車輛前、后以及側方安裝車載相機,采集車輛四周圖像通過校正、拼接等處理,在終端實時顯示車輛四周全景圖像.目前國外的全景輔助泊車研究技術成熟,如日產、豐田等的環境監視系統,目前只針對高檔轎車或SUV 上配備,價格也較為昂貴[2].國內的汽車制造廠家目前沒有一款成熟的輔助產品,主要是針對算法上的優化.文獻[3]在TMS320DM6437嵌入式平臺上實現4 路高清廣角攝像頭的實時全景拼接;文獻[4,5]在FPGA 平臺上實現了2–4 路的全景拼接處理,文獻[6]在將算法移植到GPU 平臺實現了6 路2 k 視頻的全景拼接,實時輸出4 k 高清視頻.對于大型車輛比如些重卡、貨運車來說,由于車體較大,長寬高幾倍于小型車輛,需要選用更多的大視場鏡頭以保證車輛四周場景的全覆蓋,相鄰相機間具有足夠的重疊區域.由此系統需要采用高速數據傳輸接口以及具備更強并行計算處理能力以保證視頻數據的實時傳輸與處理.目前國內外針對10 路及以上高清鏡頭的全景視頻成像系統實現方案還不成熟.
本文選擇FPGA 結合GPU 高性能嵌入式平臺,設計了12 路同步高清魚眼相機的車載全景視頻成像系統,硬件方面采用 FPGA+TX2 嵌入式平臺,通過PCIE口進行12 路攝像頭數據采集處理,軟件方面為了獲取較高的圖像配準精度進行了拼接算法的優化,實現在TX2 平臺上的拼接算法移植,結合CUDA 并行加速技術實現在FPGA+TX2 嵌入式平臺全景鳥瞰圖的實時拼接輸出,為駕駛員提供車體周圍360°景象,保證安全駕駛、泊車,避免視覺盲區隱患.
全景視覺系統是一套車輛駕駛輔助系統,采用178°超廣角高清魚眼鏡頭,選用FPGA 結合NVIDIA TX2 平臺實現視頻信號采集、全景實時拼接顯示等功能.其中FPGA 主要實現12 路HD-SDI 高清視頻信號采集、顏色空間轉換,通過PCIE 接口將圖像數據傳送給TX2,利用GPU的大數據并行加速優勢進行畸變校正、鳥瞰變換、配準融合等算法處理,最后將全景拼接俯視圖回傳給FPGA 端進行顯示,輔助車輛駕駛員直觀、實時地查看車輛周邊盲區或障礙物,做出正確判斷和操作,提高行車安全.
系統總體結構框圖如下圖所示,以Xilinx 公司的Kintex UltraScale 系列FPGA 芯片作為核心芯片,系統整體由電源、JTAG、圖像采集、圖像緩存、數據處理和顯示等部分組成,總體結構框圖如圖1.

圖1 系統總體結構框圖
系統工作流程如下:系統上電后,由FPGA 采集車輛不同方位12 路魚眼鏡頭的實時高清圖像,在外部存儲器DDR4中進行乒乓緩存,經過預處理將視頻數據由YCbCr 轉為RGB,然后通過PCIe_X4 接口將12 路RGB 圖像數據傳給GPU 模塊,在GPU 上經過魚眼畸變校正、鳥瞰變換、圖像配準、圖像拼接融合、剪切合成等一系列算法處理,生成車體周圍鳥瞰視角的360°全景高清拼接圖像.最后將全景拼接結果圖通過PCIe_X1 接口實時回傳并通過SDI 接口輸出顯示.
GPU (Graphic Process Unit,圖形處理器)[7]在并行計算、分布計算和浮點運算方面,擁有數十倍乃至上百倍于CPU的運算能力,GPU 超強的并行計算能力使得其近年來越來越多的被應用在機器學習、圖像處理加速等方向.Jeston TX2[8]是Nvidia 2013年推出的一款高性能、低功耗的AI 單模塊超級計算機,具有256個CUDA 核,其浮點計算能力可以達到1.5 Tflops.
CUDA是NVIDIA 推出的通用并行計算架構,采用GPU和CPU 混合編程的模式.在采用CUDA 進行并行程序的編寫時,應用程序代碼分為Device 端代碼與Host 端代碼兩部分,一般將邏輯較強控制、并行度較低的串行計算放在Host 端執行,而計算密度大、相互無依賴的部分放在Device 端會以Kernel的形式并發執行.通過單指令多線程(SIMT)模式,以warp為調度單位,一個warp中32個線程,GPU 一次并發執行多個warp 并行處理.
車載全景拼接算法[9]一般包含4個模塊:魚眼校正[10]、鳥瞰變換、圖像配準、圖像融合.考慮到算法實現的實時性,本文將算法分為拼接模型參數計算和實時拼接融合兩個部分.通過對相機的內外參數離線標定,生成固定不變的校正映射關系以及相鄰相機間的映射關系,計算拼接參數映射表,依據映射關系表查表實現最終的圖像拼接融合,實時輸出車體周圍的360 度全景俯視圖.
由于魚眼鏡頭是一種超大視場、大孔徑的成像系統,桶形畸變嚴重,需要對魚眼相機進行標定、畸變校正[11].本文使用OpenCV中魚眼模型[12]進行相機標定,制定棋盤格標定板,采集不同位置和方向的棋盤格標定板圖像15–20 幅如圖2,利用其自帶的標定工具箱求解出相機內參A和畸變參數K如表1所示,相機內參是固有參數,一經標定后可重復使用.利用標定的參數對魚眼圖像進行校正,校正結果如圖3.

圖2 棋盤格標定圖

表1 魚眼相機標定內參表

圖3 校正結果圖
當魚眼相機相對之間位置固定不變時,其空間的變換模型也是固定不變的.為獲取鳥瞰變換矩陣以及相鄰相機配準矩陣,借助標記棋盤格,置于相機正下方,兩邊分別再放置一張標記棋盤格,相機正下方以及兩側重疊區各擺放棋盤格分別用于標記鳥瞰陣以及相鄰相機間的單應陣,具體步驟如下:
1)車體四周擺放好棋盤格,鏡頭正下方以及左右各擺一個標記物;
2)利用基于區域生長算法[13]檢測視野內棋盤格,并篩選出正下方以及左右的特征角點;
3)分別帶入透視變換公式,得到鳥瞰Hbird和相鄰相機間配準矩陣Hmn中,經過鳥瞰后已經轉為同一平面,因此Hmn中h31=h32=0;

4)校正后圖像邊緣畸變較大,對圖像進行有效區域提取.
依據上兩節已經獲得相機內參、畸變Hbird和相鄰相機間配準矩陣Hmn等標定參數,生成逆向映射參數映射表,以查表的方式進行拼接融合.所謂逆向映射是指,已知目標圖像上像素點坐標在源圖像上的對應的索引位置,只需對源圖像上該點進行插值就可以得到輸出圖像像素點的值.
魚眼圖像首先必須經過畸變校正f(A,K,x,y),再經過鳥瞰變換,經過相鄰配準將所有相機轉換到參考相機坐標系下.假設選定Cam0 相機為基準相機,Cam1 到Cam0的單應矩陣為H01,Cam2 到Cam1的單應矩陣為H21,則Cam2 到H01基準相機的變換關系為:H02=H01?H21,按式(2)將所有相機轉到參考相機Cam0 坐標系.假設拼接蒙版圖I′上坐標為(x′,y′)逆向映射到魚眼圖I上坐標(x,y)處,蒙版圖像到魚眼圖的逆向投影的關系可以用式(3)表示,單路相機到蒙版拼接圖的中間效果如圖4所示.


圖4 算法中間處理效果圖
在完成映射參數計算(如表2和表3)后,獲取從魚眼圖像到蒙版圖的直接映射關系,還需要進行雙線性插值[14]處理消除邊緣鋸齒狀.考慮算法實時性,對于拼接連接處的縫隙、重影情況,重疊區域需使用漸入漸出融合算法[15],車載相機安裝好之后,其相對位置和角度不再發生變化,將拼接參數在實時拼接啟動前拷入GPU.

表2 非重疊區域映射參數表

表3 重疊區域映射參數表
FPGA 將采集到的各通道視頻數據通過顏色空間轉換RGB 數據后,通過直接內存存儲技術DMA 以最高帶寬速度將數據通過PCIe 從CPU 傳送至GPU 端的內存,在GPU 上進行具體的拼接融合算法運行以及加速優化,TX2 上具體執行流程圖如圖5.

圖5 基于GPU的全景拼接的軟件實現流程圖
該系統首先FPGA 端將離線標定好的參數文件通過串口傳遞給TX2;FPGA 將12 路圖像數據通過PCIE傳遞給TX2,在圖像第一幀的時候根據標定參數計算出拼接參數映射表,并將參數映射表從CPU 端拷貝至GPU 端;接著將12 路視頻數據也從CPU 端拷貝至GPU端,在GPU 端進行圖像拼接融合并行處理.
GPU 將各路視頻數據根據重疊與非重疊區域的拼接融合參數,以查表的方式對圖像進行處理,主要計算量為線性插值.在實時拼接前需先將計算的拼接融合參數拷入GPU 端并分配線程,由Kernel 函數進行并行實現.在設計線程層次時,應將并行化線程的粒度設計為一個線程對應處理一個像素.
針對重疊區域和非重疊區域不同的計算,建立兩個核函數分別進行處理.兩個Kernel 函數分別在((Overlap_N+block.x - 1)/(dimBlock.x,1)、((unOverlap_N+block.x-1)/dimBlock.x,1)個線程塊Block 上執行,每個Block 上劃分(16,16)個線程(thread).其中Overlap_N和unOverlap_N分別為蒙版圖重疊區域和非重疊區域的像素個數.這樣使得每個線程對應處理一個像素的插值融合計算,同一時刻GPU 并發執行多個warp,并行索引魚眼圖像素數據源,非重疊區域進行并行線性差值,重疊區域并行進行差值以及加權融合計算,最后將拼接結果圖傳回主機內存.
在VS2013+Matlab 上首先驗證了算法的有效性,然后將拼接算法移植到GPU 上,搭建系統環境,采用軟硬件聯調的方式進行整個系統功能測試.分別對8 路和12 路魚眼相機高清輸入時,拼接生成一幅1080 P的全景環視圖的性能測試,具體如表4.

表4 本算法加速時間對比(單位:ms)
首先實時性方面,從表中可以看出CPU 端圖像拼接融合過程運行時間相差不大,其相當于一個查表過程,計算量主要由輸出圖像的分辨率決定,可適應各種大小車型;通過CUDA的加速,全景的拼接融合耗時8.5 ms 左右,圖像數據從CPU 端拷入GPU 平均時間16 ms,拼接結果圖像考出時間為4 ms 左右.在Jeston tx2硬件平臺上12 路平均處理時間3 ms 左右,滿足實時拼接的工程化需求.但隨著拼接視頻路數的增多處理時間變長,其主要耗時在CPU 端到GPU 內存的圖像數據傳送上.最終的拼接視頻效果截圖如圖6所示.

圖6 全景視頻顯示截幀
本文基于FPGA+GPU 嵌入式實驗平臺,實現了多路魚眼攝像頭的圖像采集、緩存、處理的全景實時拼接系統.針對目前圖像拼接系統中的大數據傳輸、算法實時處理進行了改進優化.通過對算法實現CUDA加速,大幅提升了拼接速度,滿足實時化的工程需求.該系統嵌入式、低功耗的設計理念,可廣泛應用于虛擬現實、醫學影像、智能交通等領域.