索軍紅,張冠茂,喬 鑫,趙漢卿
(蘭州大學 信息科學與工程學院 光電子與電磁信息研究所,甘肅 蘭州 730000)
圖像作為承載信息的主要載體,其準確性至關重要,但在獲取圖像的過程中往往會受到各種因素的干擾,使最終成像發生畸變,從而影響人們對實際情況的分析與判斷。圖像畸變可分為非線性畸變和線性畸變。非線性畸變主要是由于相機的制作工藝不完善造成的,致使實際成像模型與理想針孔成像模型不一致。非線性畸變中真實畫面與最終成像之間的映射關系雖然復雜,但對于特定相機而言,映射關系是固定的,無需在拍攝過程中實時計算,已有許多文獻對其進行了較為充分的研究。線性畸變與相機的拍攝角度和運動狀態有關。梯形畸變作為線性畸變的一種,其成因是在實際的拍攝場景中,受限于拍攝距離和角度,攝像機往往不能垂直于被拍攝平面,造成最終成像結果產生梯形畸變[1-9]。梯形畸變矯正通常使用軟件實現,無法滿足實時矯正的需求,如向芝慧小組結合兩步投影法和Harris角點檢測算法利用軟件矯正梯形畸變,但矯正時間以數百毫秒計[10];張宇小組基于OpenCV采用連接點法矯正梯形畸變,但只有在攝像機和被拍攝平面相對位置不變的情況下才能進行實時矯正[11]。本文基于現場可編程門陣列(Field Programmable Gate Array,FPGA)提出了一種梯形矯正的新思路,采用配有XILINX artix-7XC7A100T-2FGG484I芯片的AX7103開發板為實驗平臺,可以實時且自適應地矯正梯形畸變。
梯形矯正系統結構框圖如圖1所示,其主要由OV5640攝像頭模塊、FPGA模塊、DDR3(Double Data Rate 3)存儲模塊、液晶顯示器模塊、按鍵模塊、以及其他必要模塊(電源模塊、時鐘模塊、配置電路)組成。FPGA模塊又由圖像采集模塊、灰度插值模塊、圖像預處理模塊、直線檢測模塊、參數計算模塊、DDR讀寫模塊和DDR控制模塊組成。

圖1 梯形矯正系統結構框圖
進行矯正時,由OV5640攝像頭采集圖像,FPGA模塊對圖像進行矯正,DDR3模塊負責緩存數據,最終由顯示器顯示矯正后的圖像。
該系統的基本工作原理為:圖像采集模塊通過IIC總線協議配置OV5640攝像頭,使其按照640×480的分辨率和RGB565的格式將數據傳遞給FPGA芯片,最后經由圖像采集模塊、DDR讀寫模塊和DDR控制模塊將數據存入DDR3中。
圖像預處理模塊讀取DDR3中緩存的原始圖像后對其進行灰度轉換、Sobel邊緣檢測、形態學開運算等處理[12],以達到濾除圖像干擾信息、降低后續處理運算量的目的,便于直線檢測模塊進行直線檢測。
直線檢測模塊可以提取出預處理后圖像中梯形畸變的兩條斜邊,并將斜邊參數、傾斜角度分別傳遞給參數計算模塊和視頻輸出模塊。
參數計算模塊利用斜邊參數計算出修復梯形畸變所需的映射參數,之后將其傳遞給灰度插值模塊。
視頻流時序中相鄰場同步信號間除了顯示區間之外還有一段非顯示區間,如圖2所示。本設計可以利用顯示區間之后的非顯示區間時間段運行直線檢測模塊和參數計算模塊,再結合錯幀矯正的方法,即用上一幀得到的映射參數矯正下一幀的畫面,進而實現視頻實時矯正的目的。

圖2 場同步信號時序圖
灰度插值模塊根據矯正圖像像素坐標和映射參數計算出對應原始圖像中的像素坐標,取出相應坐標的灰度值并進行計算后作為矯正圖像像素的灰度值,由此得到矯正圖像,并將其傳輸給DDR讀寫模塊緩存。通過按鍵可以控制選擇何種灰度插值算法。
視頻輸出模塊生成視頻時序信號,在圖像顯示的不同區域分別讀取原始圖像、矯正圖像數據和梯形畸變的斜邊角度信息以及相關文字說明,以實現視頻圖像、矯正圖像和畸變程度的同屏顯示。
DDR讀寫模塊用于在DDR和不同模塊之間進行數據緩存,并負責突發讀/寫請求信號和普通讀/寫請求信號的轉換,以充分利用DDR讀寫操作的高帶寬。
DDR控制器模塊按照固定順序仲裁多路DDR突發讀/寫請求,依據仲裁結果讀/寫DDR3中的數據。
直線檢測模塊是系統中最核心的部分,用于尋找畫面中梯形畸變的兩個腰。本文采用的直線檢測算法為Hough變換法[13],是一種計算簡單、易于硬件實現的方法。Hough變換公式為:
ρ=xcosθ+ysinθ,
(1)
公式(1)可將(x,y)坐標系中的直線轉換為(ρ,θ)坐標系中的一個點,將(x,y)坐標系中的點轉換為(ρ,θ)坐標系中的一條曲線。利用Hough變換可將檢測直線的問題轉化為檢測點的問題。
直線檢測模塊構成及其工作流程原理如圖3所示。邊緣圖像信息由圖像預處理模塊輸出,邊緣點坐標檢測模塊一方面基于邊緣圖像信息中的視頻流時序信號生成像素坐標,另一方面根據像素灰度值判斷當前像素點是否為邊緣點,進而決定是否激活寫請求信號。FIFO緩沖器負責緩存邊緣點坐標。若FIFO不為空,則數據控制模塊發出單個時鐘周期讀請求,并在30個時鐘周期內不再發出,以保證每個邊緣點坐標保持30個時鐘周期的輸出,供后續計算使用,讀地址也將在這30個時鐘周期內循環加一。sinθ_cosθ_ROM中存儲著60°~89°范圍內步長為1°的正、余弦函數值,并依據讀地址輸出相應正、余弦函數值以供后續計算。ρ值計算模塊1按照公式(1)計算出ρ值,ρ值計算模塊2運算過程中會將公式(1)中的加法更改為減法,如此可利用三角函數的對稱性在不增加存儲空間的情況下將角度檢測范圍擴展至-89°~-60°。在一副分辨率為640×480的畫面中,直線傾斜角度范圍分別為60°~89°、-89°~-60°時,ρ的取值范圍分別為0~800、-640~240。故可根據式(2)和式(3)分別計算投票地址。

圖3 直線檢測模塊結構框圖
addr1=addrθ×800+ρ,
(2)
addr2=addrθ×880+640+ρ,
(3)
其中,addr1為合并1模塊的輸出地址,addr2為合并2模塊的輸出地址。
獨立時鐘雙口RAM IP核的讀、寫時鐘相位相反,頻率相同,以實現在單時鐘周期內完成投票。投票記錄模塊時刻記錄最大得票數和次大得票數以及它們所對應的(ρ,θ)值。為了避免最大得票數和次大得票數對應的是同一條直線,只有在當前得票數大于最大或次大得票數,且當前得票數對應的ρ值與最大或次大得票數對應的ρ值相差超過10個單位時,才會更新相應記錄。
比較判斷模塊接收到4條直線的得票數,將得票數最多的兩條直線信息發送出去。
梯形畸變圖像與矯正圖像的空間變換關系如圖4所示。本系統應用連接點法對像素進行重定位,連接點法相較于兩步投影法,具有運算步驟少,計算簡單的特點,易于硬件實現。

圖4 空間變換關系
利用雙線性方程對該空間變換過程建模,即:
(4)
其中:(x′,y′)為畸變圖像中的像素點坐標,(x,y)為矯正圖像中的像素點坐標。
公式(4)中共有k1~k8八個未知系數,需要將4對映射點坐標代入其中才能將全部系數求出。以視頻畫面的1/4高度和3/4高度作為梯形畸變的上下底邊,其與直線檢測模塊得到的兩條直線(梯形的兩個腰)相交于4點,交點坐標分別設為(120,y1),(120,y2),(360,y3),(360,y4)。其中,y1,y2,y3,y4的計算公式為:
(5)
其中(ρ1,θ1),(ρ2,θ2)分別為直線檢測模塊輸出的兩條直線信息。
相應的,以梯形畸變中較長底邊為基準構造一個矩形,矩形的4個頂點即為畸變圖像中梯形頂點的映射點。其坐標分別為(120,y1),(120,y2),(360,y1),(360,y2)或(120,y3),(120,y4),(360,y3),(360,y4)。
以梯形畸變的上邊是較長底邊為例,將4對映射點坐標代入公式(4),得:
(6)
依據式(5)和式(6)設計的參數計算模塊結構及其工作流程如圖5所示。坐標計算模塊實現計算式(5)所需的功能,其運行最大時鐘頻率低于系統時鐘頻率,故在該模塊前后各添加一個異步FIFO,以解決信號的跨時鐘域傳輸問題。參數求取模塊完成式(6)的計算,為了節省計算資源,全程采用了浮點數形式進行計算。

圖5 參數計算模塊系統結構
矯正圖像和畸變圖像的像素點坐標并非一一對應,通過公式(4)得到的映射坐標值往往是一個小數,此時就需根據鄰近像素的灰度值對該坐標點進行插值,常用的灰度插值算法有最鄰近法、雙線性插值法和雙三次插值法。最鄰近法選用距離映射坐標最近像素點的灰度值作為映射坐標的灰度值,計算最為簡便,但經過插值后得到的圖像灰度不連續,在圖像邊緣處會出現較明顯的鋸齒狀。雙線性插值法基于映射坐標4個鄰像素的灰度值,在兩個方向上進行線性加權后得到映射坐標的灰度值,由此得到的插值后圖像灰度連續,但計算比較復雜,可能會導致圖像輪廓模糊。雙三次插值法利用三次多項式逼近理論上的最佳插值函數,映射坐標的灰度值由其鄰近的16個像素點灰度值加權內插求得,因此所得插值后圖像效果最好,但計算量也最大。
從計算復雜度、緩存資源消耗量的角度考慮,在硬件實現上放棄了雙三次插值算法,為了滿足不同需求,最鄰近法和雙線性插值法均被采用,在使用過程中通過按鍵進行選擇。
通過公式(4)和公式(6)可知,畸變圖像和矯正圖像之間映射坐標對的橫坐標(行數)一致,如圖6所示,故可以簡化相應灰度插值算法。采用最鄰近法時,取距離映射點y′最近像素點y2的灰度值作為y的灰度值。設y1點處灰度值為f1,y2點處灰度值為f2,則運用雙線性插值法計算y點灰度值f的公式為:

圖6 簡化的坐標映射關系
f=(y2-y′)×f1+(y′-y1)×f2,
(7)
灰度插值模塊系統結構及其工作流程如圖7所示,輸入數據流分配單元、雙端口RAM和輸出數據流選擇單元共同構成乒乓緩存結構,雙端口RAM大小為640×16 bit,以緩存矯正圖像當前行所對應的畸變圖像像素值。坐標計算模塊先通過視頻時序信號生成矯正圖像像素坐標,再結合矯正參數計算映射坐標,最后由映射坐標得到其鄰近像素坐標和相應權值,并分別送給乒乓緩存結構和插值模塊。乒乓緩存結構將鄰近像素坐標作為讀地址并輸出相應灰度值給到插值模塊。插值模塊接收灰度值和權值,并基于插值算法計算出當前矯正圖像像素的灰度值,插值算法的選擇由按鍵控制。

圖7 灰度插值模塊系統結構
為了驗證本文所設計梯形矯正系統的可行性及穩定性,使用Verilog語言編寫系統程序,采用XILINX公司的Vivado軟件為程序編譯平臺,對程序進行綜合、布局布線,最終生成比特流文件并燒錄進FPGA芯片。系統硬件結構如圖8所示,OV5640攝像頭直插在FPGA開發板上,HDMI_O端口連接一個1 280×760分辨率的顯示器。

圖8 自適應實時視頻圖像梯形矯正系統
開發板通電后,攝像頭傾斜一定角度拍攝目標物體,實驗場景如圖9所示。顯示器左端畫面為攝像頭采集的原始圖像,顯示器右端畫面為矯正后圖像,此外,畫面左上角顯示梯形畸變左、右兩腰與畫面中軸線的夾角,偏右為正值,偏左為負值,以表示梯形畸變幅度。并且當移動攝像頭時,系統依然能實時顯示矯正后的畫面。

圖9 矯正處理顯示效果圖
實驗結果表明,基于FPGA的視頻實時自適應梯形矯正系統可以實現對640×480分辨率、60 Hz刷新率的視頻數據實時自適應矯正,滿足日常使用需求。整個系統消耗的LUT資源占FPGA芯片總資源的25.66%,FF占用總資源的10.12%,BRAM占用總資源的20%,DSP占用總資源的9.17%,詳細資源占用情況如表1所示。

表1 FPGA資源使用情況
為進一步突出本文所提出系統的實時性,將本系統與兩步投影法和軟件連接點法所耗時間進行比較,比較結果如表2所示。其中畸變檢測時間為系統檢測到畸變幅度所消耗的時間,矯正時間指系統矯正完一幀圖像所需要的時間。從表2中可以看出,兩步投影法和軟件連接點法耗費時間至少是本文方法的21倍和300倍,在攝像頭位置不斷改變的情景中,不具備實時性;而本文方法的畸變檢測時間和矯正時間均為1/60 s,結合錯幀矯正策略即可實現對60 Hz視頻的實時矯正。

表2 時間分析
本文根據實踐的需求,針對圖像獲取過程中產生梯形畸變的問題,提出了一種自適應實時視頻圖像梯形矯正系統的硬件結構設計。利用錯幀矯正的方法實現了視頻的實時矯正,提高了系統的應用能力。通過乒乓緩存結構,使得在占用極小片上存儲資源的情況下可以連續不斷地對數據流進行處理。基于梯形畸變圖像與矯正圖像之間特殊的映射關系,簡化了參數計算過程。利用場消隱時間完成矯正參數計算,可以有效提高畸變矯正的實時性。實驗結果表明:系統可以支持對分辨率為640×480、刷新率為60 Hz的監控視頻進行自適應矯正,且矯正畫面和監控畫面之間的延時僅為1/60 s,矯正精度為1°,基本滿足監控系統梯形矯正的要求。