摘 要: 為了實現在三維重建系統中的對攝像機進行標定的目的,采用理想攝像機成像模型為基礎,在模型中引入透鏡徑向畸變和切向畸變影響的計算方法。在VC++環境下開發了一種基于OpenCV算法庫的攝像機標定算法,并同基于Matlab攝像機標定工具箱的標定結果進行了比較。實驗結果表明,該方法具有標定精度高、魯棒性好等優點,可以滿足增強現實和其他計算機視覺系統的需要。
關鍵詞: 攝像機標定; OpenCV; 計算機視覺; 透鏡畸變
中圖分類號: TN919?34; TP391.9 文獻標識碼: A 文章編號: 1004?373X(2013)08?0097?04
0 引 言
攝像機標定的目的,就是要建立三維世界坐標與二維圖像坐標之間的一種對應關系。在單目視覺中,這種對應關系是一對多的對應,即二維圖像上的一個像素點對應著三維空間中的一條直線;而在雙目視覺中,可以通過兩幅二維圖像上的對應像素點計算得到三維世界坐標與二維圖像坐標的一一對應關系。由此,便可以得到物體的三維坐標值。
目前常用的標定方法是由Tasi首先提出的基于“兩步法”的傳統攝像機標定方法[1]。隨后,張正友提出用二維平面模板來標定攝像機,他的方法首先利用線性和非線性方法求取攝像機內外參數的初值,然后再解非線性最小化方程,以求得內外參數的精確解[2]。因此,其無論在精度方面,還是在簡便方面都優于Tsai的方法,可以說它是兩步法的代表,從而使攝像機標定技術大大前進了一步。
OpenCV(Open Source Computer Vision Library)是Intel開放計算機視覺函數庫,具備強大的圖像和矩陣運算能力[3]。盡管有很多求解攝像機參數的方法,OpenCV函數庫中提供的攝像機標定方法就是基于張正友的標定方法。OpenCV中的攝像機標定模塊為用戶提供了良好的接口,并且執行速度快,具有良好的跨平臺移植性,因此可以很好地應用于工程實際當中。
1 攝像機標定原理
1.1 理想攝像機模型
如圖1所示[4],首先在棋盤模板平面上,建立世界坐標系(xw,yw,zw),世界坐標系的原點為Ow;然后以攝像機透視中心Oc為坐標原點,并使其xc軸和yc軸分別平行于像平面(Image Plane)坐標系的x軸和y軸,且方向相同,zc軸為攝像機鏡頭的主光軸,按右手定則建立攝像機坐標系(xc,yc,zc);再以像平面上像素坐標值(0,0)的點為坐標原點O,以水平像元陣列方向為u方向,以垂直像元陣列方向為v方向,建立圖像像素坐標系(Pixel Image Coordinate)(u,v);最后以主光軸與像平面的交點Od為坐標原點,建立圖像物理坐標系(Physical Image Coordinate)(xd,yd),并使其坐標軸分別平行于圖像像素坐標系。
建立好以上4個坐標系后,棋盤模板平面上的一點pw(xw,yw,zw),在不考慮透視畸變情況下,其成像點在圖像像素坐標系下的坐標pu(u,v)記為[2]:
[zcuv1=A3×3R3×3t3×1xwywzw1] (1)
式中:[zc]為pw點在攝像機坐標系下的深度;[A3×3]為攝像機內參數矩陣;[R3×3t3×1]是攝像機的外參數矩陣;R和t分別表示世界坐標系相對于攝像機坐標系的旋轉矩陣和平移向量。其定義如下:
[A3×3=αcu00βv0001,R3×3=r1r2r3]
式中:a,b分別表示在x和y方向上像點的物理坐標到像素坐標的比例系數;u0,v0表示主光軸與像平面的交點(主點)在像素坐標系下的坐標;參數[c]描述了2個圖像坐標軸之間的歪斜(即2個坐標軸不完全垂直的情況)。需要說明的是,考慮到當前的像機制造水平,可以認為2個坐標軸是垂直的,因此在OpenCV所使用的模型中認為c=0。
在張正友的平面標定法中,標定板位于世界坐標系的z=0平面內,即對于模板上的點,其zw=0,這樣式(1)重寫為[5?6]:
[zcuv1=A3×3r1r2r3t3×1xwywzw1=A3×3r1r2r3t3×1]
[xwyw01=A3×3r1r2t3×1xwyw1] (2)
式中:[r1],[r2],[r3]為旋轉矩陣[R3×3]的列向量。令[H=r1r2r3=Ar1r2t],H稱為模板和圖像之間的單應矩陣(Homography)。式(2)可以改寫為:
[zcuv1=Hxwyw1] (3)
通過一系列運算后,就可以得到攝像機的所有內參數和外參數[2,4]。
1.2 引入畸變后的攝像機模型
以上表示的是理想情況下的透鏡成像方程,然而由于實際的像機存在著制造精度誤差,因此實際的攝像機存在著徑向、切向畸變。
這里,為攝像機定義一個歸一化的圖像平面,這個平面平行于攝像機的像平面,且到針孔的距離為單位長度。接著在這個平面上建立一個坐標系,原點在光軸和這個平面的交點處。由針孔透視投影可知,攝像機坐標系下的點([xc],[yc],[zc])在這個歸一化的像平面上的投影點的坐標([xn],[yn],1)可以寫為:
[xn=xczcyn=yczc] (4)
引入透鏡的畸變后,新的歸一化坐標值定義為[7]:
[xdyd=1+k1r2+k2r4xnyn+2k3xnyn+k4(r2+2x2n)k3(r2+2y2n)+2k4xnyn] (5)
式中:[r2=x2n+y2n];[k1],[k2]表示徑向畸變系數;[k3],[k4]表示切向畸變系數。
應用上述畸變模型后,最終成像點在圖像像素坐標系下的坐標為:
[uv1=A3×3xdyd1] (6)
當4個畸變系數為0時,上面的公式退變成[8]:
[uv1=A3×3xczcyczc 1=1zcA3×3xcyczc] (7)
1.3 標定方法
OpenCV中的攝像機標定是基于張正友的平面標定方法來完成的[3,5]。該方法要求使用一個具有較高繪制精度的棋盤模板,然后通過自由移動攝像機或標定模板,使得攝像機至少在3個不同的位置(相對標定模板)拍攝模板圖像。在求解相機內外參數時,第一步暫不考慮攝像機鏡頭的畸變,通過將檢測到的所有角點代入投影方程,求得模板和圖像之間的單應矩陣H,然后確定攝像機的內部參數和外部參數的初始值。第2步,再以這些參數為初始值,考慮畸變的影響,應用Levenberg?Marquardt算法對圖像點與再投影點間的距離之和進行非線性最小優化,以得到一組精度更高的值[9]。
2 基于OpenCV 的標定系統實現
攝像機標定算法的流程如圖2所示。
(1)初始化。用cvCreateMat()函數為攝像機的內外參數以及所有圖像最大可能數量的角點分配存儲空間。
(2)讀取一副標定用的圖像并進行角點檢測。用cvFindChessboardCorners()函數檢測并提取圖像中的棋盤角點位置。如果返回值為1,則表示該幅圖像上提取的角點數目和設定的相同,角點提取成功;否則返回0,表示角點提取失敗,即該幅圖像中提取到的角點數要少于設定的數目。
(3)細化角點坐標并繪制。對提取到的角點,需要使用cvFindCornerSubPix()函數對這些角點進一步的細化,以得到更為精確的角點像素坐標。而后,調用cvDrawChessboardCorners()繪制提取到的角點。
(4)對于角點提取成功的圖像,存儲角點在世界坐標系下的坐標值以及在圖像坐標系下亞像素級的坐標值。
(5)讀取完所有圖像后,根據角點提取成功的圖片數量,為它們中的所有角點重新分配數據空間,并釋放原有的數據空間。
(6)標定。調用cvCalibrateCamera2()函數,求取攝像機的內外參數。需要注意的是該函數輸出參數里的rotation_vectors矩陣。
該矩陣里的每一行(或列)向量表示的是相應的一副圖像所對應的旋轉向量,當需要轉換成旋轉矩陣時,要使用羅格里格斯變換函數(cvRodrigues2)。
(7)標定結果的誤差分析。這里使用重投影的方法來計算標定誤差,即根據得到的攝像機內外參數,調用cvProjectPoints2()計算角點三維坐標在圖像上的投影坐標,然后,調用cvNorm函數將其與通過角點提取到的投影坐標進行比較,從而得到一個均方誤差值。
(8)計算每幅角點提取成功圖像的旋轉矩陣、旋轉向量和平移向量。
3 試驗與結果分析
根據以上標定原理和開發步驟,本文在Windows XP平臺下,用Visual C++開發了一個基于OpenCV 1.0版本的攝像機標定程序。試驗使用Canon IXUS 85IS型照相機,分辨率為640×480像素。標定所用的模板是在A4紙上用激光打印機打印的黑白相間的國際象棋圖案,然后將其粘貼在平板上。
模板中方格邊長為30 mm,共有6×8=40個角點。利用9副圖像對攝像機進行標定,檢測出的角點如圖3所示,標定結果如表1第2列所示,總體平均誤差為0.031 562 6個像素。
為了驗證標定結果的正確性,本文還利用Matlab中標定工具箱對這9副圖像進行了攝像機標定,結果如表1第3列所示。從中可以看出,兩者的值是非常接近的,因此證明了本文標定程序的正確性。
4 結 語
利用OpenCV開發的攝像機標定程序具有標定結果精確、運算效率高、跨平臺移植性好等優點,可以有效地應用于需要計算機視覺系統的各個領域。利用OpenCV庫的強大功能可以縮短程序員的開發周期,使計算機視覺技術從理論走向實際應用。
參考文獻
[1] TSAI R Y. A versatile camera calibration technique for high?accuracy 3D machine vision metrology using off?the?shelf TV cameras and lenses [J]. IEEE Journal of Robotics and Automation, 1987, 3(4): 323?344.
[2] ZHANG Zheng?you. Flexible camera calibration by viewing a plane from unknown orientations [C]//International Conference on Computer Vision(1CCV).Proceedings of Seventh International Conference on Computer Vision. Liege, Belgium: Elsevier Science Publishers, 1999: 666?674.
[3] BRADSKI Gary, KAEHLER Adrian. Learning OpenCV: computer vision with the OpenCV library [M]. [S.l.]: O’Reilly Media,2008.
[4] 毛劍飛,鄒細勇,諸靜.改進的平面模板兩步法標定攝像機[J]. 中國圖象圖形學報,2004,9(7):846?853.
[5] 陳勝勇,劉勝.基于OpenCV的計算機視覺技術實現[M].北京:科學出版社,2008.
[6] 高偉.相機與成像模型[EB/OL]. [2010?10?09].http://vision.ia.ac.cn.
[7] BOUGUET Jean?Yves. Camera calibration toolbox for Matlab [EB/OL]. [2010?07?09]. http://www.vision.caltech.edu/Bouguetj/calib_doc.
[8] FORSYTH David A, PONCE Jean. Computer vision : a modern approach [M]. [S.l.]: Person Education, Inc., 2004.
[9] 尹文生,羅瑜林,李世其.基于OpenCV的攝像機標定[J].計算機工程與設計,2007,28(1):197?199.
[10] 伍尤富.基于平面模板的攝像機兩步標定方法[J].電子科技,2007(9):71?74.
[11] 陶旺林,盧選民,劉李娟,等.基于OpenCV的非線性圖像畸變校正研究[J].現代電子技術,2011,34(12):117?120.
[12] 梁華,李興福.OpenCVVS架構、算法及應用[J].現代電子技術,2012,35(6):134?137.
[13] 黃振峰,陳海平,鄧培,等.基于OpenCV與USB工業相機零件檢測系統的圖像處理研究[J].現代電子技術,2012,35(18):128?132.