趙子國,閔祥濤
中國電波傳播研究所,山東 青島 266107
相機光學系統在設計、加工及裝配過程中,由于加工誤差及工藝水平的影響,使得成像系統不能在整視場滿足針孔成像模型,進而導致原始圖像發生扭曲、變形,不能真實客觀地反映3D物理世界的空間位置信息[1]。特別對于90°至120°左右的廣角相機,畸變更加嚴重。目前,國內外學者已經對廣角相機的圖像畸變校正做了大量的研究工作,探索出了如張正友標定法等效果較好的校正方法,但國內的相關研究主要是對預采集完成的圖像在PC端軟件進行畸變校正,缺少對廣角相機進行實時校正的研究。在一些需現場更換鏡頭的場景,傳統基于PC端軟件的校正難以滿足實時性需求。本文設計了一種基于ARM的廣角相機畸變校正系統,將相機畸變校正算法在ARM中實現,無需借助PC機即可完成,提升了校正系統的實時性。
本文使用棋盤格標定板,采用數字圖像處理方法進行相機畸變校正。首先通過角點匹配建立畸變圖像與標定板的映射變換矩陣。然后根據映射變換矩陣計算出相機內外參,將其作為后續優化的初始值。其次,加入相機畸變模型,完善變換矩陣,通過非線性優化方法得出相機內參及畸變系數的最優值。最后,利用相機內參及畸變系數的最優值對畸變圖像進行畸變校正。
1.1.1 映射變換矩陣
(1)坐標系建立。像素坐標系:以數字圖像左上角為坐標原點,以像素為單位建立的直角坐標系,如圖1(a)中O0-UV坐標系。圖像物理坐標系:原點定義在相機光軸與圖像平面的交點,采用實際物理長度單位,如圖1(a)中O1-XY坐標系。相機坐標系:以相機光心O為原點,Xc、Yc分別平行于x軸和y軸,Zc與光軸重合,建立O-XcYcZc坐標系。光心到圖像平面的距離為相機焦距f。世界坐標系:在物理三維環境中,建立世界坐標系Ow-XwYwZw。

圖1 坐標系示意圖
(2)變換關系。假設空間中一點P在世界坐標系的坐標為Pw=(xw,yw,zw),在圖像物理坐標系的坐標為P1=(x,y),在像素坐標系下坐標為P0=(u,v)。(u0,v0)為圖像物理坐標系原點O1在像素坐標系下的坐標,dx、dy分別為x軸和y軸的像元尺寸大小。
假設相機為針孔相機模型[2],且選擇定義物理平面,使得Zw=0,則有:
1.1.2 H矩陣求內外參
則有:
則兩個約束可以寫成:
如果對棋盤格平面采集n個圖像,通過角點匹配并計算得到n個單應性矩陣H,代入上述方程組,則可以得到2n個方程。求解這個方程組,即可得到矩陣B。
1.1.3 相機畸變模型
相機畸變主要可分為徑向畸變和切向畸變兩類[4]。
徑向畸變是沿著相機鏡頭透鏡半徑方向分布的畸變,產生原因是光線在遠離透鏡中心的地方比靠近中心的地方更加彎曲,徑向畸變主要包括桶形畸變和枕形畸變兩種。相機光軸中心的畸變為0,沿著鏡頭半徑方向向邊緣移動,畸變越來越嚴重。畸變的數學模型可以用主點周圍的泰勒級數展開式的前幾項進行描述,通常使用前兩項,即k1和k2,對于畸變很大的鏡頭,如廣角鏡頭,可以增加使用第三項k3來進行描述。
切向畸變是由于透鏡本身與相機傳感器平面(成像平面)或圖像平面不平行而產生的,這種情況多是由于透鏡被粘貼到鏡頭模組上的安裝偏差導致。
綜合考慮相機的徑向畸變和切向畸變,可得到相機畸變校正模型為:
根據1.1中所述畸變校正原理,可按照以下步驟進行校正。
(1)準備棋盤格標定板,打開廣角相機并從多角度拍攝標定板,獲取10~20張含完整標定板的圖像。
(2)檢測圖像中的特征角點,建立每張圖像與實際物理棋盤格標定板的映射關系,求解單應性矩陣H。
(3)利用公式(1)構建方程組,估算相機內參和外參,并作為后續優化的初始值。
(4)加入相機畸變模型,建立優化模型進行優化:
式中mij表示世界坐標系下的點Pj在第i張圖像上的投影點,表示通過內外參及畸變系數計算出的投影點坐標。
上述方程為非線性方程組,通過LM方法進行迭代求解,進而得到相機內參、外參及畸變系數的最優解。
(5)根據計算得到的相機內參、畸變系數的最優解,代入變換模型得到校正后的圖像。
本部分將從平臺構建、軟件設計兩個方面進行敘述。
2.1.1 硬件平臺
硬件平臺選擇以ARM-Cortex-A7為內核的I.MX6ULL芯片作為核心處理芯片,外圍搭配接口處理電路、存儲電路等構成數據處理板,數據處理板連接攝像頭模組、LCD顯示器等,完成相機圖像數據采集及處理。數據處理板硬件資源:CPU主頻800MHz;內存256MB;FLASH容量256MB;擁有LCD、USB、攝像頭及TF卡等接口。
廣角相機參數:圖像傳感器的像元尺寸為1.4μm,300萬像素;鏡頭的焦距為1.5mm,DFOV為102°。
2.1.2 Linux軟件平臺
本文相機畸變校正算法基于Linux-Opencv實現,首先需在ARM平臺上移植嵌入式Linux系統,再將Opencv庫移植到嵌入式Linux系統中,最后根據1.2中所述算法流程編寫代碼實現對廣角相機的畸變校正。
(1)嵌入式Linux移植。一個完整的嵌入式Linux系統包含bootloader、Linux內核以及根文件系統組成。嵌入式Linux系統移植過程如下。
①bootloader移植:本文使用的bootloader為uboot,以NXP官方發布的uboot為基礎,通過添加處理板默認配置文件、頭文件、板級文件夾,修改硬件驅動等步驟使uboot適配數據處理板,再編譯下載uboot至ARM中。
②Linux內核移植:本文選擇Linux-4.1.15版本,以Linux源碼為基礎,使用imx_v7_mfg_defconfig配置文件配置Linux內核,修改設備驅動,再對Linux內核進行編譯生成zImage鏡像文件以及設備樹文件,最后下載至ARM中。
③根文件系統移植:本文使用BusyBox構建根文件系統,通過修改Makefile文件、配置BusyBox等步驟生成rootfs目錄文件,再添加lib庫,創建dev、proc等文件夾,修改rcS、fstab、inittab等文件,最后下載至ARM中。
(2)OpenCV庫移植。OpenCV是一個跨平臺的計算機視覺處理開源軟件庫,可在包括Windows、Linux等不同系統平臺上使用。
本文選擇opencv-3.4.1版本,移植過程如下:①將獲取到的opencv-3.4.1源碼在Linux環境下解壓;②通過cmake-gui圖形化工具根據需求選擇需要的庫進行配置,并生成Makefile等文件;③使用make指令進行編譯,安裝至創建的install目錄下后,再拷貝至根文件系統/usr/lib下。
至此,基于ARM平臺的Linux系統及其圖像處理庫構建完畢。
軟件實現主要包括相機圖像采集、校正算法實現兩部分。
2.2.1 相機圖像采集
本文采用Linux內核中視頻類設備驅動框架V4L2編寫相機驅動實現圖像采集,該驅動框架提供了一套統一的接口規范,每一個videoX設備文件代表一個視頻類設備。應用程序通過對videoX設備文件進行I/O操作來使用該類設備[5]。
編寫應用程序實現相機圖像采集時,應遵循V4L2設備驅動框架規范,其編程流程如下。
(1)使用open函數打開相機設備文件。
(2)查詢相機的屬性、功能。
(3)設置相機參數,如使用ioctl(fd,VIDIOC_S_FMT,&fmt)設置幀格式。
(4)申請幀緩沖,再進行內存映射。
(5)開啟幀緩沖入隊,而后通過調用ioctl(fd,VIDIOC_STREAMON,&type)進行圖像采集。
(6)幀緩沖出隊,并從幀緩沖中獲取數據、進行處理。
(7)處理完后,再次將幀緩沖入隊,往復。
(8)停止相機采集,取消內存映射,關閉設備。
通過上述相機圖像采集應用程序從多角度采集15張含完整標定板的圖像,并存入FLASH中供后續校正算法使用。
2.2.2 畸變校正
系統相機畸變校正軟件基于OpenCV庫實現,其編程流程如下。
(1)讀取FLASH中保存的15張圖片,對每張圖片提取特征角點,如果檢測到的所有角點排布方式與棋盤格標定板角點的排布方式相同,則認定該幅照片有效并生成圖像特征點位置數組,否則直接丟棄并繼續處理下一張圖片。可使用cornerSubPix函數作進一步優化計算,使角點的位置精度達到亞像素級別。
(2)根據棋盤格標定板特征角點的排列位置關系建立物理特征點位置數組,利用FindHomography函數求解圖像特征點位置數組與物理特征點位置數組的映射關系,得到單應性矩陣H。
(3)由H矩陣,利用Solve函數、FindExtrinsic CameraParams2函數分別得到相機內參、外參,并作為優化初始值。
(4)在相機映射變換矩陣基礎上加入相機畸變模型,構建優化模型,運用LM方法使所有視圖的重投影誤差之和最小,取最小點處相機內參、外參及畸變系數的值作為最優值。
(5)根據計算得到的相機內參、畸變系數的最優值,可通過getOptimalNewCameraMatrix函數獲得新內參值以去除畸變校正后圖像四周黑色區域,再利用undistort函數得到校正后的圖像。
系統上電并等待Linux系統啟動后,運行相機驅動程序完成對棋盤格標定板多視角采集,圖像采集數量為15張。采集的圖像如圖2(a)所示。

圖2 相機采集圖像
運行系統相機畸變校正軟件,讀取采集到的15張圖片,經過計算得到相機內參及畸變系數。再選取待校正圖片,如圖2(b),點擊校正,即可得到校正完成后的圖片,如圖2(c)。可見,系統對畸變圖像有較好的校正效果。
本文設計了一種基于ARM平臺的廣角相機畸變校正系統,擺脫了傳統基于PC端進行校正的方法,將廣角相機校正算法在嵌入式ARM平臺得到了實現,使系統實時性得到了提升,取得了較好的校正效果,具有一定的實際工程應用價值。后續將對算法進行優化,使實時性得到進一步提升。