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