改善魚眼影像扭曲
由於魚眼攝影機具有超廣角特性與成本效益,因此越來越廣泛應用在汽車的後視影像系統。然而,雖然魚眼鏡頭(1)能夠提供非常寬廣的視野角度,理論上可達整個正前方半球的180°,但因必須將一個半球型的畫面投影到一個平面上,也造成影像會產生嚴重的扭曲變形。在觀看魚眼鏡頭所拍攝的影像時,這些扭曲變形會造成錯覺與混淆。因此,魚眼鏡頭所捕捉到的影像若應用在汽車後視攝影機時,在展現給駕駛觀看之前應該進行修正,使其接近光線直射時所看到的影像。
當已知基本的攝影機參數時,修正魚眼扭曲相對來說只是單純的數學問題,然而,由於修正過程需要進行大量的數學運算,因此無法輕易地以FPGA實現。本文將討論只要知道基本的攝影機參數,便可在FPGA上執行魚眼修正的創新架構。
魚眼扭曲與映射功能
筒狀變形現象
魚眼鏡頭能夠與一般的非魚眼鏡頭一樣,透過先行透視(直射)映射,並選擇以特殊的映射(例如equisolid角度)方式來代替,讓影像的特性呈現出凸透鏡的效果,以達到極寬廣的視野範圍(FOV),如圖一(左)所示。放射狀扭曲的產生原因,是因為魚眼映射會讓影像的放大倍率隨著光軸的距離增加而減小,這種現象也稱之為「筒狀變形」,呈現出的效果便是影像會延著球面進行映射。如此一來,魚眼影像並無法保留最重要的直射影像特性,因為直射影像會將場景中的直線映射到影像中的直線上。
圓形(半球)與全幅魚眼影像
魚眼影像有兩種形式:
- ●圓形(半球)魚眼影像。這是將圖框中整個半球視角投影到一個圓形上來成像;換言之,影像圈會記錄在底片或感測器區域之內,將延著垂直與水平方向各有180°的角度,如圖一(左)所示。
- ●全幅魚眼影像。這是將半球影像以底片或感測器區域為邊界來成像,如圖一(右)所示。它在對角線上具有180°的視角,水平與垂直面的視角則會比較小。
很明顯地,如果採用較小的感測器或底片尺寸拍攝時,圓形魚眼也可以改成全幅。
魚眼鏡頭參數設定
魚眼鏡頭的特性由兩個基本參數來決定:焦距長度與視野範圍,在魚眼攝影機中,這些參數還會與感測器或底片的尺寸相關,不同的魚眼鏡頭的影像扭曲情形並不同,且扭曲的狀況是由它們的映射功能所決定。
如果θ代表真實世界中的一個點與光軸之間的角度,此時的影像中心會通過鏡頭的中心,R則代表影像中的一個點與相對於θ的半徑位置,鏡頭的焦距長度f則為不同的映射功能(2):
- ●透視投影(一般,非魚眼鏡頭):R = f tan(θ)。這是一種很像針孔相機的簡易運作模式,是基於一般攝影機的直射無扭曲映射模式,如圖二(左)所示。
- ●線性比例(等距):R = fθ。此時的θ在圖二(右)中代表著弧度,這是針對魚眼鏡頭的最簡單映射功能,且它在魚眼鏡頭中可明確地對標示出來,在底片上一個點的半徑位置將不同於透視映射,將會偏移到不同的位置上。
《圖二 透視投影(左)與線性比例投影(右)示意圖 》 |
|
相同地,還有其他的魚眼鏡頭映射功能:
- ●Equisolid角度:R = 2fsin(θ/2)。這是我們分析過最普遍的映射功能。
- ●正投影:R = fsin(θ)。
- ●立體投影(一致):R = 2ftan(θ/2)。
演算法描述
找出Rp與Rf之間的相對關係
如上所述,在魚眼影像中一個點的半徑位置(Rf)與在透視影像中的位置(Rp)是不同的,因此,修正扭曲的魚眼影像的作法,便是找出Rp與Rf之間的相對關係,其中差異可透過解出透視映射與魚眼映射這兩個方程式定義的解答找到答案。由於必須能夠解出這些方程式所相關的三角函數運算功能,如果想要在FPGA中實行,將是件困難的工作。
FPGA查找表及像素內插法
因此,開發嶄新的模式簡化修正被扭曲魚眼影像的程序便非常重要。要了解Rp與Rf之間的關係,完全決定於攝影機的幾何構造,像是焦距長度(f)與視野範圍(FOV),這意味著這些參數可以預先進行運算,並以查找表(LUT)的形式加以儲存。FPGA會使用查找表來映射扭曲魚眼輸入影像的像素,然後加以修正後再輸出影像。由於這牽涉到次像素的產生,這種模式需要FPGA來執行一些像素形式的內插法,像是9點內插法模式便是一種簡單且非常有效率的像素內插法的形式,可產生可接受且無扭曲的影像輸出。
查找表的運算
運算公式
透過魚眼攝影機所捕捉到的輸入影像圖框會被標示為來源影像,而修正後的輸出則為目標影像,來源的魚眼扭曲影像的修正工作可以被定義如下:針對在目標影像中每個像素的位置,運算出它在來源影像中相對應的像素位置(3)。
讓xp與yp成為輸出的透視(直射)影像中各自的目標像素的x與y座標,同樣地,讓xf與yf成為在輸入魚眼影像中的來源像素的座標,然後為魚眼影像假設出一個equisolid角度映射,讓以下的方程式保持為真值:
在此的Rp是從透視影像的中心到一個像素的半徑位置,且Rf則是從魚眼影像的中心到一個像素的半徑位置,假設影像的中心會相對應到魚眼鏡頭的中心,且消去上述三個方程式之間所獲得的θ值:
在此的 與f是像素的焦距長度,也可以用以下的方程式來進行計算:
如此一來,每個目標像素與在魚眼影像中相對應像素的位置都可以被運算出來,並以查找表的形式加以儲存。查找表所需的所有參數都需要預先得知,像是成像裝置的特性(包括成像器的視野範圍與輸入圖框的尺寸)與顯示系統的特性(包括顯示尺寸),由於是針對特定的成像器與顯示系統,因此查找表僅需被運算一次,且可進行離線運算。
呈現結果
圖三的左邊與右邊,是圖一魚眼影像的左邊與右邊相對的修正結果,其各自的效果則如圖所示。請注意,想要獲得具有延著某些方向的180°視野範圍且經過修正的魚眼影像,其修正後的影像尺寸將會是無限大,當然這是不可能的事。因此目標的視野範圍必須強制使其小於180°。在全幅魚眼影像的狀況下,延著水平與垂直方向的來源影像視野範圍將會小於180°,如果目標影像的視野範圍大於來源的魚眼影像,則在來源影像視野範圍之外的點將會被標示為黑色,這將產生稱為「蝴蝶結」效果的特性,如圖三(右邊)所示,在角落的影像會被拉伸展開,這將可透過確保目標影像的視野範圍永遠比來源魚眼影像還要小,避免發生這種現象。
《圖三 魚眼修正影像—圓形(左邊)與全幅(右邊)》 |
|
9點內插法
避免FPGA實數值查找表問題
查找表可以為每個目標像素的位置提供對應的來源像素的位置。無論如何,來源像素的位置可以是一個實數,需要進行一些像素內插法則來運算目標影像的實際像素值。此外,具有實數值的查找表(需要用浮點數字來表示)將讓FPGA在應用上變得較不方便。如果使用9點內插法方案,透過提供簡單且有效率的法則來進行像數的內插運算,將可避免在查找表中儲存實數,進一步解決了這些問題。
比較其他像素內插法
其他的像素內插法則比較不是那麼好用,例如「最近點」內插法是一種在運算上相當簡單且快速的方法,但有時也會在某種程度上產生不佳的效果,並可能導致明顯的影像瑕疵。而像是雙線性內插法這種更複雜的內插法技巧,則會牽涉到浮點運算問題,FPGA並不適合進行有效率地處理,9點內插法方案則屬於介於最近點與雙線性內插法方案之間的中庸之道,可以涵蓋映射查找表的實數值像素到其相鄰最近的九個點,如圖四所示。
9點內插法模式簡介
在這種模式下,所有虛擬像素的明暗值,是從鄰近的真實像素取其明暗度的平均值所計算得來。舉例來說,像素(x, y+0.5)的色彩明暗度是實際像素(x, y)與(x, y+1)的色彩明暗度的平均值,(x+0.5, y+0.5)的明暗度值則是真實像素(x, y)、(x+1, y)、(x, y+1)與(x+1, y+1)的明暗度平均值。
這種技巧的主要優勢在於可以克服先前所討論的其他兩種模式所產生的問題,可以簡化運算又不需要大幅地犧牲修正影像的品質。這是因為其只需運算兩個或四個像素的平均值,當除以二時,可以透過將數字的總和「右移」一個位元的方式來實現;當除以四時,則可以透過將總和右移兩個位元來實現,這種排序式的運算對FPGA來說相當簡單。
9點內插法方案並不需要查找表儲存任何實數值的像素點位置,它可以直接儲存真實或者虛擬像素的位置,來映射出像數的實數值,因此可以輕易地用固點運算的表現方式來達成。
設計實行硬體架構
FPGA產品結合軟式核心嵌入式處理器
利用FPGA產品系列元件與軟式核心嵌入式處理器,便可實行魚眼影像修正的功能。軟式核心嵌入式處理器架構是一種RISC軟式核心架構,能夠整個在FPGA的可編程邏輯與記憶體模組下實行,並能夠處理像是從DSP到系統控制等廣泛多樣的嵌入式運算應用。處理器的軟式核心在本質上便可讓系統設計師指定與產生出客製化的核心,為特定的應用需求來量身訂製,相關嵌入式評估套件(NEEK)可以用來做為開發平台。
如圖五所示,其硬體架構包含以下模組:軟式核心嵌入式處理器、一個視訊輸入模組、一個I2C設置模組、一個DDR-SDRAM控制器與一個LCD控制器。
視訊輸入模組
視訊輸入模組式是針對相容於ITU-R BT.656數位視訊標準所設計,負責處理色彩空間轉換(CSC)、影像裁切、解交錯訊號、比例縮放與24位元RGB打包,每個操作都會依序地執行,如圖六所示,且均可透過處理器的暫存器控制來加以參數化。此外,視訊輸入也可以針對想要的輸出格式來進行影像裁切與縮放(上或下)。暫存器可以讓系統能夠客製化為多種的顯示解析度與像是NTSC、PAL或SECAM等輸入的視訊格式,來自模組的視訊資料則可以透過直接記憶體存取(DMA)通道來轉換到外部的SDRAM圖框緩衝區。
視訊輸入設置模組
I2C設置模組是用於在想要的格式下來的IC視訊解碼器(4)、(5),可提供以8位元的ITU-R BT.656 YCrCb 4:2:2數位視訊標準來輸出。
LCD控制器
LCD控制器用於scatter-gather演算法,以達到更快速的資料轉換,不需要擔心由於要讓處理器來承擔工作,導致其成為限制因素。如圖七所示,LCD SGDMA從外部SDRAM圖框緩衝區取得資料,然後將資料送到FIFO以用於實行雙埠RAM,以便搭配LCD周邊來調整資料速率。像素轉換器與資料格式轉換器會依據LCD顯示系統的規格來修改資料,視訊同步產生器則是用來取得格式化的資料,以產生適當的時鐘訊號,並將資料送到顯示器。
記憶體需求與管理
從攝影機將會獲得連續性的資料輸入,並需要將之最佳化傳輸量,以便進行快速的即時性處理。當需要進行儲存與恢復影像,以及在魚眼影像修正進行必須的額外資料處理工作時,有效率的記憶體管理將變得非常關鍵,在NEEK中的架構會利用可用的記憶體資源來執行以下的用途:
輸入圖框緩衝區
這是在快速SS RAM上實行,從視訊解碼器IC的輸入中採用一種16位元的交錯式RGB565格式,其中每個像素需要佔用2位元組。當輸入攝影機的解析度是656×492像素時,在保留單一輸入圖框時所需的記憶體需求量為:
- ●輸入影像寬度×輸入影像高度×每個像素所需的位元組=652×492×2位元組=630.375 Kbytes
輸出圖框緩衝區
這也是在SDRAM上實行,緩衝區的大小是依據顯示器的解析度而定,以NEEK顯示螢幕解析度為800×480像素為例,其輸出格式也是RGB565,其保留給輸出圖框的記憶體需求量為:
- ●輸出影像寬度×輸出影像高度×每個像素所需的位元組=800×480×3位元組=1125 Kbytes
儲存與讀取靜態查找表
在電源開啟之後,每次影像進行修正之時,必須從已知的攝影機與顯示器參數在外部產生查找表,因此,它必須存在於NEEK之中。由於RAM無法用於永久性的儲存靜態查找表,因此必須使用非揮發性的CFI快閃記憶體,但由於快閃記憶體有較高的存取時間,因此查找表必須複製到RAM模組中,以便達到想要的運算速度。
儲存查找表注意事項
為了得到每個目標影像的像素,查找表包含來源影像的像素座標(透過使用9點內插法獲得),依據映射的來源像素各自是真實的還是虛擬的像素,以此來用整數值或以0.5為單位的十進位值來代表。換言之,查找表的數值可以是x或(x+0.5)(如果x代表任何整數值),或是y或(y+0.5)(如果y代表任何整數值)。
無論如何,我們在儲存查找表時要符合以下兩個要求:
- ●當在描述查找表時,我們想要避免儲存與運算浮點數值。
- ●當取得的影像是交錯式格式時,將同時並存偶數與奇數欄位,為了擁有最快的速度,我們不想要在處理影像輸入時,還要進行解交錯處理。
查找表紀錄值資料顯示形式
最後一個需求可以透過當在產生查找表與執行期間,運算出正確的偏移值來達成,因此任何一個在交錯式輸入影像中已映射(實際的)原始像素都可以被直接對應到。想要滿足前一個需求,需要注意9點內插像素x與y座標的整數部分,將必須一直對應到一個實際的原始影像像素。如此一來,每個查找表的紀錄值便可以使用以下的32位元資料形式來表示:
- ●前29個最重要的表示位元是用來對交錯式原始影像的9點內插像素的x與y座標之整數部分進行編碼;
- ●第三個較次要的表示位元代表著坐落在偶數欄位(位元值為0)或奇數欄位(位元值為1)中的像素位置;
- ●第二個較次要的表示位元代表著x座標是一個整數值(位元值為0)或是浮點值(位元值為1);
- ●最後一個的表示位元代表著y座標是一個整數值(位元值為0)或是浮點值(位元值為1)。
比起當我們在CFI快閃記憶體中用浮點值來儲存時,這種方法在儲存查找表時顯得更有效率。
查找表的大小將依據輸出圖框的大小而定,每個輸出像素在查找表中需要4位元組(32位元)的儲存空間,因此用於儲存查找表所需保留的記憶體需求量為:
- ●影像輸出寬度×影像輸出高度×每個查找表資料所需的位元組=800×480×4位元組=1500 Kbytes
所有的這些記憶體功能將會使用控制訊號來執行,從CPU傳送到SDR控制器,SDR控制器連接到SDRAM晶片,並處理所有的SDRAM通訊協定需求。
產生輸出圖框
從查找表中一次會讀出兩個數值,代表著輸出圖框的每個x與y座標,查找表透過輸出圖框來建立索引,它的值是輸入圖框的像素位置,它們的明暗度必須指派到或用於運算出輸出圖框對應像素的明暗度,我們首先透過檢查它的最後一個代表位元(LSB)與第二個代表位元,來判斷查找表紀錄值是相對應到實際的或虛擬的像素:高值代表著這是一個實際的像素,低值則代表其是虛擬的像素。然後透過採用9點內插法的技巧,用直接指派(此時是一個實際像素)或採取平均值(此時是一個虛擬像素)的方式,RGB565明暗度會指派到輸出圖框的像素上,以決定輸出像素的明暗度。以下的範例程式便是用來描述這種方法:
- ●
- DETERMINE(決定)查找表的記憶體大小:顯示的寬度×顯示的高度×4位元組
- ASSIGN(指派)在SDRAM中靜態查找表的記憶體大小
- OPEN(開啟)快閃記憶體元件
- 從快閃記憶體複製靜態查找表到SDRAM
- CLOSE(關閉)快閃記憶體元件
- COMPUTING THE OUPTUT FRAME(運算輸出圖框)
- FOR(針對)輸出影像的每一行
- FOR(針對)輸出影像的每一列
- OBTAIN(取得)在靜態查找表中像素位置的值(向右平移查找表3位元)
- IF如果)像素位置是 INVALID THEN(無效的,然後)
- ASSIGN(指派)像素為 BLACK(黑色)
- ELSE(否則)
- IF(如果)像素位置表示為 REAL(實際)像素 THEN(然後)
- ASSIGN(指派)其相對應的輸入像素的明暗值給輸出像素
- ELSE IF(否則如果)像素位置表示為FICTITIOUS(虛擬)像素THEN(然後)
- COMPUTE(運算)依據欄位是偶數或奇數來求出最接近實際輸入像素的平均明暗度
- ASSIGN(指派)輸出像素的數值
- ENDIF
- ENDIF
- ENDFOR
- ENDFOR
- DISPLAYING THE FRAME(顯示圖框)
- ASSIGN(指派)所運算出的輸出圖框做為螢幕緩衝區
結論
使用FPGA與軟式核心嵌入式處理器技術的嶄新架構,能夠在廣角攝影機中進行魚眼影像修正。這種架構具有靈活性、可調整性,並能夠有效率地使用FPGA的資源,因為架構中所使用的處理器足夠處理額外的嵌入式處理器功能,這種技術非常適合像是汽車後視攝影機與其他有使用廣角攝影機的應用。
(作者為Altera資深車用電子部門行銷經理)
<參考資料:
1、「魚眼鏡頭」,維基百科:
http://en.wikipedia.org/wiki/Fisheye_lens
2、在電腦繪圖中的變形與投影,David Salomon,Springer,2006年。
3、Nios II處理器參考手冊:
www.altera.com/literature/lit-nio2.jsp
4、Nios II嵌入式評估套件,CycloneR III版本,使用手冊:
www.altera.com/literature/ug/niosii_eval_user_guide.pdf
5、Nios II快閃記憶體編程器使用手冊:
www.altera.com/literature/ug/ug_nios2_flash_programmer.pdf>