張宏宇,焦新泉,,賈興中
(1.中北大學(xué)電子測試技術(shù)國家重點實驗室,太原 030051;2.中北大學(xué)儀器科學(xué)與動態(tài)測試教育部重點實驗室,太原 030051)
現(xiàn)代戰(zhàn)爭中,無人平臺自身的環(huán)境識別、避障以及對目標(biāo)物體距離的測算都需要雙目視覺。雙目視覺是基于視覺差原理,在空間中放置兩個平行的攝像頭同時拍攝同一場景,計算得出的兩幅圖像中同一點的位置偏差,得出雙目相機(jī)所處環(huán)境的深度信息[1-3]。實現(xiàn)雙目匹配算法,常用的平臺有CPU、GPU 和FPGA。雙目立體視覺中的圖像采集、矯正以及配算法通常包含簡單、大量且重復(fù)的操作,并行且實時執(zhí)行這些操作也是算法實現(xiàn)的關(guān)鍵。雖然GPU 在執(zhí)行立體匹配算法有與生俱來的優(yōu)勢,但是在無人平臺移動端領(lǐng)域的應(yīng)用,一方面對雙目匹配算法的實時性有較高的要求,另一方面也對運算平臺的功耗有嚴(yán)苛的限制,F(xiàn)PGA 可根據(jù)不同算法特點,設(shè)計硬件特殊的加速結(jié)構(gòu),是一種專一功能的硬件電路。因此,可以用較低的功耗實現(xiàn)所要求的算法,根據(jù)實際使用場景的特點,進(jìn)行架構(gòu)的優(yōu)化設(shè)計,并在性能和功耗之間找到平衡點。
設(shè)計方案如圖1 所示,由時鐘模塊、圖像處理模塊、控制模塊、傳輸模塊4 部分組成。通過調(diào)用MMCMIP 核實現(xiàn)時鐘模塊,為其他模塊提供驅(qū)動時鐘。圖像采集采用了兩個高分辨率、高采集速率的OV5640 CMOS 圖像傳感器,為了使其正常工作,通過配置控制模塊設(shè)置其內(nèi)部寄存器,把16 位圖像數(shù)據(jù)、幀同步信號、行同步信號、傳輸?shù)綀D像處理模塊[4]??刂颇K由FPGA 和DDR3 組成,F(xiàn)PGA 主要負(fù)責(zé)驅(qū)動OV5640 總線,實現(xiàn)對圖像傳感器的采集,DDR3 讀寫控制模塊負(fù)責(zé)驅(qū)動DDR3 片外存儲器,緩存圖像處理模塊輸出的圖像數(shù)據(jù)。圖像處理模塊由雙目校正和中值濾波組成,中值濾波可以有效消除圖像中的隨機(jī)噪聲,雙目校正模塊負(fù)責(zé)消除相機(jī)畸變。傳輸模塊將處理后的圖像數(shù)據(jù)編碼發(fā)送到HDMI 接口。
圖1 方案設(shè)計Fig.1 Scheme design
OV5640 是一款1/4 英寸圖像傳感器,配置寄存器的接口為兩線式SCCB 接口,兼容IIC 協(xié)議,SCCB的寫傳輸協(xié)議如圖2 所示,一共32 位,分成4 個8位發(fā)送,其中,有7 位數(shù)據(jù)地址、1 位讀寫控制位、16位寄存器地址、8 位寫數(shù)據(jù)組成[5]。
圖2 SCCB 傳輸協(xié)議Fig.2 SCCB transmission protocol
開機(jī)正常工作前,需要對其內(nèi)部寄存器初始化,以得到需要的圖像。依次設(shè)置ISP 輸入窗口大小、預(yù)縮放窗口大小以及輸出窗口大小,攝像頭最終輸出的圖像大小為640*480,預(yù)縮放窗口要與輸出窗口比例保持一致,才能得出1∶1 的不變形圖像。通過配置FORMAT CONTROL 寄存器使圖像輸出格式為RGB565,RGB565 格式采用16 bit 數(shù)據(jù)表示一個像素點,而一個像素周期內(nèi)只能傳輸8 bit 數(shù)據(jù)。因此,需要兩個時鐘周期才能輸出一個完整的RGB565 數(shù)據(jù),輸出數(shù)據(jù)為[9∶0],其中,高8 位[9∶2]為有效位。
OV5640 與FPGA 芯片連接如圖3 所示,攝像頭輸出數(shù)據(jù)的同時,也會輸出場同步信號VSYNC用于標(biāo)志一幀數(shù)據(jù)的開始與結(jié)束,行同步信號HSYNC 用于標(biāo)志一行數(shù)據(jù)的開始與結(jié)束,數(shù)據(jù)像素時鐘PCLK 用于給控制模塊提供讀取數(shù)據(jù)時鐘。當(dāng)VSYNC 和HSYNC 同時為高電平時,說明數(shù)據(jù)有效,開始采集,每個像素時鐘PCLK 產(chǎn)生8 位像素數(shù)據(jù),此時FPGA 不斷讀取圖像數(shù)據(jù),直到下一個幀同步信號的上升沿到來時,便完成一幀圖像數(shù)據(jù)的采集。
圖3 OV5640 與FPGA 芯片連接Fig.3 The connection of OV5640 with FPGA chip
本系統(tǒng)采集處理模塊的時鐘和發(fā)送模塊時鐘相差較大,為了實現(xiàn)像素的跨時鐘傳遞,需要使用外部存儲器DDR3 來緩存圖像數(shù)據(jù)。DDR3 相較于前兩代產(chǎn)品有更高的運行性能與更低的電壓,其最大特點是雙沿觸發(fā),即在參考時鐘信號的上升沿和下降沿都能進(jìn)行數(shù)據(jù)接受和發(fā)送,同樣的時鐘下,DDR 的讀寫速度是傳統(tǒng)SDRAM 的兩倍。其bank 位寬為8,行位寬為14,列位寬為10 位,數(shù)據(jù)位寬為16 bit,單片DDR3 總?cè)萘繛? 096 Mbit。雖然DDR3控制時序非常復(fù)雜,開發(fā)難度較大,但是FPGA 自帶了DDR3 的控制器硬核,直接操作MIG_IP 核便可實現(xiàn)數(shù)據(jù)的讀寫操作。MIG_IP 核的輸入時鐘為200 M,由時鐘模塊提供,IP 核通過內(nèi)部的倍頻和分頻分別向DDR3 提供400 M 的運行時鐘,向頂層提供200 M 的操作時鐘。因為DDR3 是雙沿觸發(fā),所以其帶寬為:
400 M×2×16 bit/s=12.8 Gbit/s
一幀雙目圖像的數(shù)據(jù)量達(dá)到:
640×480×16 bit/s=4.687 5 Mbit/s
所需帶寬為:
4.687 5 Mbit×60 Hz=281.25 Mbit/s
傳輸帶寬已遠(yuǎn)超本系統(tǒng)所設(shè)計的需求。
例化的MIG_IP 核輸入輸出位寬為128 bit,為了使IP 核能夠連續(xù)讀取數(shù)據(jù),在IP 核的寫入和讀出端分別例化了一個位寬為128 bit、位深為512 bit的FIFO,如圖4 所示。寫入一行數(shù)據(jù)時,先把640*16 bit 數(shù)據(jù)存入128 bit*80 的FIFO 中,重復(fù)480 次便可緩存一幀圖像。同理,讀出數(shù)據(jù)時,先將數(shù)據(jù)緩存到FIFO 中,再由FIFO 傳遞給后面的圖像處理模塊。
圖4 MIG_IP 核與FIFO 操作示意Fig.4 The operation schematic diagram of MIG_IP core and FIFO
為了防止只使用一個存儲空間緩存圖像數(shù)據(jù),使當(dāng)前讀取的圖像與之前存入的圖像發(fā)生交錯,本系統(tǒng)使用了DDR3 的兩個BANK,用來緩存采集模塊讀取的圖像數(shù)據(jù),如圖5 所示。用開辟出的兩個存儲空間進(jìn)行乒乓操作,初始化結(jié)束后,將輸出的第1 個數(shù)據(jù)寫入BANK1 首地址中,通過DDR3 控制模塊對輸出的數(shù)據(jù)進(jìn)行計數(shù),并且使它們分配入相應(yīng)的地址空間。計數(shù)達(dá)到DDR3 BANK 的最大寫地址后,完成一幀圖像的存儲,DDR3 的數(shù)據(jù)位寬為16 位,將處理后的兩個8 位雙目攝像頭的數(shù)據(jù)也組合為16 位,所以DDR3 每個BANK 的最大存儲地址為行場分辨率的乘積。當(dāng)幀復(fù)位信號到來時,切換BANK2 以達(dá)到乒乓操作,并同時指向BANK2 的首地址繼續(xù)下一幀圖像的存儲。這樣,圖像數(shù)據(jù)寫入時,就會在兩個BANK 之間不斷切換,在讀出時,先判斷是否讀完當(dāng)前BANK,再找出當(dāng)前時刻下沒有被寫入的BANK,讀取其中的圖像數(shù)據(jù)。
圖5 DDR3 乒乓操作Fig.5 DDR3 ping pong operation
處理后的數(shù)據(jù)選擇使用HDMI 輸出,其默認(rèn)為RGB 三通道,它同樣也可以選擇YCrCb 格式的輸出。同樣通過乒乓操作,從DDR 中讀出左右兩組8位矯正后的灰度圖像,以及行同步信號和場同步信號組合10 位數(shù)據(jù),通過編碼算法模塊將其轉(zhuǎn)化為TMDS 編碼,這種編碼可以減少對傳輸線的電磁干擾。之后使用7 系FPGA 自帶的并串原語轉(zhuǎn)換器OSERDESE2,將其轉(zhuǎn)化為串行數(shù)據(jù),由于輸出的為灰度圖,所以將HDMI 的RGB 三通道均賦灰度值。之后將3 個數(shù)據(jù)通道和一個時鐘通道通過OBUFDS原語轉(zhuǎn)換成差分信號輸出。
中值濾波作為一種常用的降噪方法,不僅可以去除孤立噪點,而且可以保持圖像的邊緣特性,不會產(chǎn)生顯著的模糊,從而讓圖像中的像素值更接近真實值[6],其表達(dá)式為:
g(x,y)=med·{ f(x-m,y-n),(m,n∈W)}
式中,f(x,y)為原圖像,g(x,y)為中值濾波處理后的圖像。
中值濾波的一般方式是以某點為中心畫出矩形窗口,對窗口內(nèi)的數(shù)據(jù)排序,取排序后的中間值為當(dāng)前點的濾波輸出。在RGB 圖像中,對RGB 3 個分量分別排序,最后用排序后的3 個中值組成像素值,這樣雖然簡單,但是會產(chǎn)生新的像素值,為了避免失真,本系統(tǒng)依舊用灰度值作為排序標(biāo)準(zhǔn)。根據(jù)著名的心理學(xué)公式:
Gray=0.229×R+0.587×G+0.114×B
在FPGA 中得出灰度值,需要采用高位補充低位的方法,將之前得到的RGB565 格式轉(zhuǎn)換為RGB888 格式,用RGB 分量的高三、二、三位補充到低位。計算灰度圖時,為了避免浮點運算,可以先將每個分量擴(kuò)大256 倍,再向右移8 bit,公式變形為:
Gray=(77×R+150×G+29×B)>>8
有多種方法可以在中值濾波快速求得中值,例如冒泡排序法、選擇排序法等方法。為了在FPGA 中可以高效地得出中值,本系統(tǒng)選擇采用流水線的操作方式,如下頁圖6 所示。
圖6 流水線法求中值Fig.6 Obtaining median with pipeline method
首先求出3 行中的最大值、中間值、最小值,排序后組成新的3×3 矩陣,再依次求出最大值中的最小值,中間值中的中間值,最小值中的最大值,得到的3 個值再取中間值,便可求得9 個值的中值[11]。在FPGA 中,首先例化兩個FIFO,將圖像前兩行的數(shù)據(jù)存入FIFO 中,當(dāng)前輸入的圖像數(shù)據(jù)作為第3行數(shù)據(jù),當(dāng)3 行數(shù)據(jù)采集結(jié)束時,從FIFO 中讀出前行像素點對應(yīng)的前兩行數(shù)據(jù),便得到一個三行一列的像素數(shù)據(jù),重復(fù)3 次便可得到所求3×3 的矩陣,如圖7 所示。由于獲得三行一列以及最終的3×3矩陣各需要一個時鐘,所以將同步信號都延遲2 個時鐘,以確保輸出的同步。
圖7 中值濾波結(jié)構(gòu)Fig.7 Median filtering structure
流水線法求中值濾波只對圖像的數(shù)據(jù)流造成3個時鐘的延遲,而系統(tǒng)時鐘為50 MHz,對系統(tǒng)影響較小。中值濾波用較少的資源便實現(xiàn)了對圖像的簡單初步處理,其所用資源如表1 所示。
表1 中值濾波所用資源Table 1 Resources used for median filtering
通常雙目相機(jī)在生產(chǎn)和裝配時,由于制造工藝的問題,其內(nèi)部的透鏡會產(chǎn)生不同程度的光學(xué)畸變,使得到的圖像與實際不同,除此之外,兩個相機(jī)的光軸也不完全平行,相機(jī)之間還存在旋轉(zhuǎn)關(guān)系。為了方便后續(xù)的處理,需要對相機(jī)進(jìn)行標(biāo)定,建立相機(jī)的幾何模型[12]來矯正這些偏差,如圖8 所示。
圖8 相機(jī)幾何模型Fig.8 Geometric model of a camera
從圖像的世界坐標(biāo)到數(shù)字坐標(biāo)需要3 種坐標(biāo)變換,如圖9 所示:
圖9 坐標(biāo)系之間轉(zhuǎn)換關(guān)系Fig.9 Conversion relationship of coordinate systems
世界坐標(biāo)系通過旋轉(zhuǎn)和平移可以變?yōu)橄鄼C(jī)坐標(biāo)系,其關(guān)系式如下:
其中,Xw、Yw、Zw為世界坐標(biāo)系,為物體的實際位置,Xc、Yc、Zc為相機(jī)坐標(biāo)系;t 矩陣代表平移向量;R 矩陣代表旋轉(zhuǎn)矩陣,為相機(jī)為外參[9-10]。
相機(jī)坐標(biāo)系通過透視變換變?yōu)閳D像坐標(biāo)系。其中,點P 到點p 關(guān)系如下式所示,其中,f 為相機(jī)的焦距。
“前年?噢,原來您是老革命啊,失敬失敬。來,您躺在床上,我給您查查體?!蔽姨稍谠\室的床上,蘇大夫又是敲打腰部,又是抬高我的腿,弄得我右腿又疼了起來。
模擬圖像坐標(biāo)與像素圖像坐標(biāo)之間只是原點不同,沒有旋轉(zhuǎn)變換,故只需要進(jìn)行二次變換,其關(guān)系如下式所示。
此外,還存在切向畸變,如:
為了得到內(nèi)參與外參矩陣,可以利用MATLAB中的立體相機(jī)標(biāo)定工具箱(stereo camera calibrator toolbox)對雙目攝像頭進(jìn)行標(biāo)定。將雙目相機(jī)固定放在某一空間中,在相機(jī)前放置一塊不斷隨機(jī)改變與攝像頭之間的空間關(guān)系標(biāo)定板,獲得不同角度下的標(biāo)定板圖像,通過上位機(jī)將雙目攝像頭采集的圖像數(shù)據(jù)傳輸至標(biāo)定工具箱,利用Extract grid corners 函數(shù)進(jìn)行角點檢測[8],效果如圖10 所示。
圖10 角點檢測Fig.10 Corner detection
立體相機(jī)標(biāo)定工具箱還可以顯示標(biāo)定板與雙目相機(jī)之間的空間關(guān)系如圖11 所示:
圖11 標(biāo)定板與相機(jī)空間關(guān)系Fig.11 The spatial relationship of a calibration board and a camera
雖然Extract grid corners 函數(shù)高效且精確,但通過反向擬合得出標(biāo)定點與實際點的整體平均誤差達(dá)到0.2 像素,如圖12 所示。
圖12 標(biāo)定點與實際點誤差Fig.12 The errors between the calibration points and the actual points
通過工具箱,最后得出的內(nèi)參、外參矩陣如下:
在FPGA 中,畸變矯正采用逆向映射的方法,逆向映射是矯正后圖像到源圖像的映射,掃描矯正后的像素點,利用函數(shù)映射矩陣的逆矩陣計算出該像素點在源圖像中的對應(yīng)位置[5]。逆向映射矩陣的計算需要經(jīng)過非常復(fù)雜的矩陣、乘法以及浮點運算,將會耗費大量的FPGA 資源,所以并不適合在FPGA 上完成。由于相機(jī)的內(nèi)外參數(shù)矩陣固定不變的,所以可以將逆矩陣在PC 中計算出一個映射表,存入FPGA 的ROM 中,利用查表法得到逆向坐標(biāo),如圖13 所示。
圖13 逆向映射法示意圖Fig.13 Schematic diagram of reverse mapping method
通常情況下,矯正后圖像上的像素點經(jīng)過逆向映射到原圖像后,坐標(biāo)通常是非整數(shù),無法得出像素數(shù)據(jù)。此時可以利用雙線性內(nèi)插法,利用每個像素點與其鄰近的像素點之間的灰度值變化是線性的原理,在垂直和水平兩個方向分別進(jìn)行一次線性插值,得出矯正后圖像像素點的灰度值。
雙線性內(nèi)插法主要如下頁圖14 所示,像素點之間的距離為1,則離P 最近的4 個像素點分別為Ix,y、Ix+1,y、Ix,y+1和Ix+1,y+1,其水平方向的差值公式為:
圖14 雙線性內(nèi)插法Fig.14 Bilinear interpolation method
Iup=(1-Δx)·Ix,y+Δx·Ix+1,y
Idown=(1-Δx)·Ix,y+1+Δx·Ix+1,y+1
垂直方向插值為:
I=(1-Δy)·Iup+Δy·Idown
在無人平臺中,可以先將標(biāo)定板置于雙目相機(jī)視角內(nèi),不斷變化標(biāo)定板的位置并拍攝一組照片,將拍攝好的照片上傳至PC 中,利用PC 計算出內(nèi)、外參數(shù)矩陣,進(jìn)而求得映射表,再傳回雙目系統(tǒng)的ROM 中,即可完成雙目的標(biāo)定。
本系統(tǒng)基于賽靈思公司的XILINX Artix-7 系列XC7A100TFGG484-2 芯片,模塊的編寫語言為Verilog HDL,軟件開發(fā)平臺和仿真平臺為Vivado。實時的雙目采集與矯正效果對比如圖15、圖16 所示,試驗結(jié)果表明,該雙目視覺采集處理系統(tǒng)可以實時采集圖像并矯正,設(shè)計功耗為1.344 W,相較于CPU、GPU,功耗較低,如圖17 所示。也為后續(xù)的代價計算、代價聚合以及得出深度圖、視差圖提供了基礎(chǔ)平臺。
圖15 矯正前圖像Fig.15 Pre-correction image
圖16 矯正后圖像Fig.16 Post-correction image
圖17 設(shè)計功耗Fig.17 Designed power consumption
雙目視覺采集與處理系統(tǒng)充分發(fā)揮了FPGA 的并行高速處理的特點,同時實現(xiàn)了并行的中值濾波算法和圖像的矯正,通過試驗證明,該系統(tǒng)可實現(xiàn)實時雙目圖像采集、矯正等功能,后續(xù)可將FPGA 更換為ZYNQ,攝像頭得出的視頻流數(shù)據(jù)傳遞可以使用Video in to AXI4-StreamIP 核,轉(zhuǎn)成AXI4 MemoryMap 格式[14]。在現(xiàn)代戰(zhàn)爭中,該雙目視覺平臺可以應(yīng)用于無人平臺,為其帶來的深度信息感知周圍環(huán)境,進(jìn)行自主作業(yè),完成對空間目標(biāo)的實時定位,為其他任務(wù)提供引導(dǎo)依據(jù)。