前 言
在VSLAM中,經常會使用魚眼鏡頭或者廣角鏡頭。本文主要分為理論部分與魚眼鏡頭標定實踐兩部分,其中理論部分,主要參考《A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses》,作者為Juho Kannala和Sami S. Brandt,寫于2006年,同時這篇文章的作者在2004年也寫了一篇與魚眼鏡頭標定相關的論文《A Generic Camera Calibration Method for Fish-Eye Lenses》,同樣值得參考。
一 理論部分
對于大多數具有窄角甚至廣角鏡頭的傳統相機,針孔相機模型伴隨著鏡頭畸變是一個比較不錯的近似。但是針孔模型不太適用于魚眼鏡頭。魚眼鏡頭一般被設計用來覆蓋相機前方的整個半球形視場,視角非常大,約180°。然而,不可能通過透視投影在有限的圖像平面上投射半球形視場。因而,魚眼鏡頭服從某些其他投影模型。這就是為什么魚眼鏡頭本身固有的畸變不應該僅被認為是與針孔模型的偏差。
很多作者對魚眼鏡頭的適合的可能模型進行了研究。許多方法的思想是將原始魚眼鏡頭成像為遵循針孔模型,畸變參數是通過變換后強制按直線來估計的,但問題是這些方法并不能完全校準。最近,魚眼鏡頭相機的第一種自動校準方法也出現了,Claus和Fitzgibbon[1]提出了一種畸變模型,它同樣允許相機運動和鏡頭幾何的同時線性估計,而Thirthala和Pollefeys[2]使用徑向一維攝像機的多視圖幾何來估計非參數相機模型。此外,Barreto和Daniilidis最近的工作引入了徑向基本矩陣來糾正廣角鏡頭的失真[3]。然而,這些方法的重點更多的是在于自動校準技術,而不是真實鏡頭的精確建模。
由于透視投影模型不適用于魚眼鏡頭,我們使用更靈活的徑向對稱投影模型。
不失一般性,甚至權重都被取消了。這是因為我們可以將r作為奇函數擴展到負數一側,而奇數冪跨越連續奇函數集。對于計算,我們需要確定(6)中的各項。
為了使得本文不那么枯燥,關于魚眼鏡頭標定的理論部分我們僅介紹到這里,如果感興趣的讀者,可以去仔細研讀論文《A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses》。
二 實踐部分
在上述論文作者的主頁,作者提供的Matlab標定代碼:Camera Calibration Toolbox for Generic Lenses:http://www.ee.oulu.fi/~jkannala/calibration/calibration.html。
此處,筆者簡單為大家介紹一下OpenCV中關于魚眼標定的流程。
首先,可以參考OpenCV Documentation中提供的魚眼鏡頭標定相關函數:
https://docs.opencv.org/3.2.0/db/d58/group__calib3d__fisheye.html
具體魚眼鏡頭標定步驟如下:
本次實驗,使用小覓相機(標準版)進行實驗,小覓相機的鏡頭視角較大,大約在140°左右。小覓相機實物如下圖2所示。
圖2 小覓相機(標準版)實物圖
Step-1:制作標定板。可以是圓,也可以是棋盤格,當然也可以是圓環。此處我們選擇4*11的OpenCV提供的圓形標定板。為了使得標定結果趨于收斂,在工作距離附近,在不同姿態下,采集近20~30張標定圖片,如下圖3所示。
圖3 標定板采集樣圖
Step-2:進行形態學處理。此處是由于在采集圖片過程中,難免會在圖片中引入環境光帶來的噪聲。
Step-3:檢測每一張圖片中的圓心角點坐標,并排序。(OpenCV中findCirclesGrid函數同時解決了這個問題)。
Step-4:進行標定。(cv::fisheye:calibrate)
Step-5:計算重投影誤差。在Step-3中,cv::fisheye::calibrate返回值為總重投影誤差,當然也可以進一步計算x和y方向的重投影誤差值。
Step-6:(此步非必須)進行去畸變,進一步驗證標定參數的正確性。
組合使用函數:
1)fisheye::estimateNewCameraMatrixForUndistortRectify 2)cv::fisheye::initUndistortRectifyMap 3)remap
即可獲得畸變矯正后的效果圖。
經過魚眼標定后,使用標定好的參數進行去畸變后效果圖(使用函數
void estimateNewCameraMatrixForUndistortRectify(InputArray K, InputArray D, const Size &image_size, InputArray R,
OutputArray P, double balance = 0.0, const Size& new_size = Size(), double fov_scale = 1.0)
進行估計新的相機矩陣用于畸變矯正或者校正時,圖4為參數balance設為0時的畸變矯正效果圖,圖5為參數balance設為1時的效果圖)。
圖4 魚眼模型標定后,畸變矯正,balance=0時
圖5 魚眼模型標定后,畸變矯正效果圖,balance=1.0時
如果選用針孔模型來進行標定,去畸變后的效果圖如下所示。
使用針孔模型進行標定后,同樣對圖3進行去畸變效果圖如下(圖6為balance=0,圖7為balance=1時):
圖6 針孔模型標定后,畸變矯正效果圖,balance=0時
圖7 針孔模型標定后,畸變矯正效果圖,balance=1時
由圖可見,使用針孔模型去畸變后,整個畫幅的圖像的畸變不符合「枕形」或者「桶形」,因而使用針孔模型來進行標定魚眼鏡頭是不太適合的。
三 跋
最后,留個大家一個問題可以去思考,作者在文章中提到,對于圓形的中心在經過透視變換后,由于較大的畸變存在,橢圓的中心已經不再對應圓形的中心。那么,對于橢圓的中心構象偏差,又該如何去矯正呢?
2025-06-06 12:38
2025-06-05 11:44
2025-06-03 18:34
2025-06-03 18:33
2025-06-03 18:30
2025-05-28 21:29
2025-05-28 21:24
2025-05-28 21:20
2025-05-26 18:37
2025-05-26 18:35