鱼眼镜头及其标定
1. 魚眼鏡頭特性與鏡頭分類
普通鏡頭和針孔相機在數(shù)學模型上可以等價對待,都是射影變換(Perspective transform);
魚眼鏡頭受到水下斯涅耳窗口現(xiàn)象的啟發(fā),采用不同的投影方式,來得到極大的視場角;
魚眼鏡頭常用的投影方式包括等距投影、等積投影、體視投影、正交投影等;
2. 魚眼鏡頭與呈像相似性
對日常生活、甚至一些藝術(shù)創(chuàng)作、科學研究來說,保持像與物的相似是一件好事。偏離相似性,我們就說鏡頭有了畸變,大多數(shù)時候,我們并不希望鏡頭有畸變,甚至在設(shè)計鏡頭的時候,專門針對「偏離相似性」——也就是鏡頭畸變進行校正。不過在一些特殊的場合,我們也需要特意偏離物像的相似性,以求得其他方面的便利。
一個極好的例子是氣象科學中,對天空云量的測量。在這個場景中,人們希望能夠獲得盡可能大的視野范圍,最好是直接把整個天空一次性拍攝下來——這就要求鏡頭能夠達到 180° 的視場角。容易想到,我們可以把天空和云看做分布于一個半徑無窮大的球面上,也就是說,我們要把一個(半)球面的場景盡可能全地記錄、拍攝下來。普通的超廣角鏡頭難以完成這樣的任務(wù)。
如圖所示,面對半球場景,普通的超廣角鏡頭只能記錄中間的部分,越靠近邊緣,透視變形越大。圖中同樣長度的紅色箭頭,靠近邊緣的話,經(jīng)過鏡頭成像之后就變得更長;對于極端接近邊緣的物體,普通的廣角鏡頭是無法成像記錄的。這種情況下,追求「相似性」反而成為了障礙。
既然追求「相似性」的普通鏡頭難以勝任這樣的任務(wù)場景,那么我們放棄相似性是不是就可以完成任務(wù)了呢?比如,對于靠近邊緣的光線,我們不再要求他繼續(xù)保持出射角與入射角相等,而是彎折一些,這樣不就可以記錄更大的視角范圍了嗎?而且物體的長度也不至于被拉伸得很厲害。
人們想到了水下的魚。由于水的折射率比空氣大,光線從空氣進入水中,折射角比入射角更小,并且入射角越大,這個變小的程度也越大。這正好是我們所需要的特性。由于這個特性,使得水下的魚在向上看的時候,能一眼看到整個水面上的這個半球形空間;這整個空間的影像,都被「扭曲」、「壓縮」到了一個半頂角約為 48° 的錐形內(nèi)。
空氣-水界面處的光線折射與全反射)
在這個錐形空間內(nèi)部,是來自水面上的空間的光線,在這個錐形外部,是來自水面下景色的反射。也就是說,在水下向上看,在一個圈之外,只能看到水底的景色;所有水面上的景色,都被壓縮在一個圈內(nèi)。這個圈,也叫「斯涅耳窗口(Snell’s window)」
3. 魚眼鏡頭及投影方式
從數(shù)學上來說,普通的鏡頭成像相當于進行了一次射影變換。那么魚眼鏡頭是一個什么變換呢?我們來看看,魚眼鏡頭的變換,需要有什么樣的特性。
3.1
**第一,視角要大。**或者說,對于某一個入射角,經(jīng)過鏡頭之后射向成像面的出射角,一定是要小于入射角的。否則沒辦法在一個相對較小的范圍內(nèi)記錄極大的視角。
**第二,最好這個變換有比較良好的性質(zhì)。**什么叫「良好的性質(zhì)」?比如說普通鏡頭對應(yīng)的射影變換,就有良好的性質(zhì),經(jīng)過射影變換后,很多幾何特征能保持不變,直線還是直線、圓錐曲線還是圓錐曲線。我們希望魚眼鏡頭對應(yīng)的這個變換,也能夠保持一些幾何特征不變。比如,變換前后,圓還是圓;比如,變換前后,一塊空間所占的立體角不變。
第三,最好這個變換的形式比較簡單。簡單的形式方便讓人從成像中直接觀測、推斷,而不用經(jīng)過復雜的運算才能看出拍的是個什么東西。
我們來看看,滿足這三個條件的情況下,魚眼鏡頭可以有什么樣的變換形式(我們把這種變換叫做投影,Projection)。為了直觀地感受不同投影方式帶來的差異,我寫了一個簡單的圖形渲染器。受到 WiKi Fisheye lens 中的場景啟發(fā),我設(shè)置了一個差不多的場景,是一個直筒型的管道,管道壁上有規(guī)則的顏色格子。在這個場景中用不同的投影方式去模擬魚眼鏡頭拍攝的圖像,以便讓大家有一個直觀的感受。
(模擬場景管道內(nèi),普通 14mm 超廣角不同視角拍攝的效果)
斯涅耳窗投影,也就是真的去模仿水下魚類向上看的時候的場景,我把這個投影方式叫做斯涅耳窗投影。用公式表達出射角和入射角之間的關(guān)系是 θ′=sin?1?(sin?θ/n),其中 θ 是入射角,θ′ 是出射角,n 是水的折射率。很顯然,這種投影方式最大的視角不會超過 180°。這種投影方式?jīng)]什么特別的用處,在這里也只是作為最初的起點。現(xiàn)實中我從來沒見哪個魚眼鏡頭是用這種投影方式的。
(斯涅耳窗投影效果)
3.2 投影函數(shù)
魚眼相機按照一定的投影函數(shù)來設(shè)計,盡可能大的場景投影到有限的圖像平面內(nèi)。根據(jù)投影函數(shù)的不同,魚眼相機的設(shè)計模型大致能被分為四種:等積投影模型、等距投影模型、體視投影模型、正交投影模型。下面的四種魚眼相機的投影模型反映出了空間中的一點P是如何投影到球面上,然后到圖像平面上成像的。
3.2.1 等積投影模型
等積投影(Equisolid angle,equal area),也叫等立體角投影。用公式表達物體成像后與畫面中心的距離 r 與入射角 θ 之間的關(guān)系就是 r=2fsin?(θ/2)。
這種投影方式的特征在于,能保持變換前后,物體所占的立體角大小不變。或者說,在半球形空間中,半球面上兩個「面積」相同的圖案,成像后,在成像平面上的兩個圖案的面積仍然相同(雖然兩者形狀不一定相似)。這正是這個投影方式名字的由來。這種特性使得這個投影方式被廣泛應(yīng)用,其中一種場合就是測量全天云量覆蓋情況。整個天空中云量覆蓋多少,是由云所占的空間立體角的比例決定的。用這種投影方式的鏡頭,直接對著天空拍一張,在照片中測量一下云所占的像素面積比例,就得到了全天云量覆蓋情況。在下圖的模擬場景中,圓筒壁上每一列的各個小方格的面積都是相等的。
(等積投影效果)
3.2.2 等距投影模型
等距投影(Equidistance,linear scaled)。這種投影方式的特點是,物體在成像面上離開畫面中心的距離,與物體在空間中離開光軸的角度成正比,這個比例系數(shù)就是鏡頭焦距。用公式表達這個距離與角度的關(guān)系就是 r=fθ,其中 r 就是物體的像到畫面中心的距離,就是入射角,也等于物體在空間中離開光軸的角度。
在這種投影變換下,物體離開中心的距離(角度)就是一個重要的幾何性質(zhì),物體的空間角距離與物體的像在像平面上的平面距離,是成正比的。這也是這個投影方式名稱的來源。這種方式的鏡頭較少,然而更多地用在軍事領(lǐng)域。想像一下武器瞄準系統(tǒng),使用這種投影方式的鏡頭,不僅監(jiān)測的視野范圍大,而且對于目標的方位角度,只要直接在畫面里測量平面距離就可以了,非常方便。在下圖的模擬場景中,中間一列的各個小方格的高度都是一樣的。
(等距投影效果)
3.2.3 體視投影模型
體視投影(Stereographic,conform)。用公式表達就是 r=2ftan?(θ/2),其中各個符號含義同前。這種投影方式的特點是能保持角度不變,這在數(shù)學上是一個非常良好的性質(zhì),叫做「保角變換(Conform)」
保持角度不變,意思是任何直線相交的角度,在變換之后是保持不變的(雖然直線本身可能變彎曲)。在保角變換下,一個圓仍然還是一個圓(直線可以看做直徑無窮大的圓),所以在某種程度上,保角變換也是保持了「形狀」不變的。在下面的模擬場景中,圓筒壁上的所有邊界線,全部都變成了圓弧;所有線的交角,也都保持了 90° 不變。
(體視投影效果)
3.2.4 正交投影模型
正交投影(Orthographic)。這種投影方式,就像是把整個半球直接拍扁,用公式表達就是 r=sin?(θ)。
在幾種投影方式中,這種投影方式帶來的扭曲最大,對邊緣物體壓縮最厲害,實際很少使用。很顯然,這種投影方式的最大視場角也不能大于 180°。
(正交投影效果)
在實際的商品化的民用鏡頭中,等積投影和等距投影都有不少使用,尤其在科研領(lǐng)域,相對的體視投影的鏡頭較少,不過也因為這種投影變形較小,還能保持角度不變,使得這種投影方式的鏡頭擁有相當多的愛好者
4. OpenCV中的魚眼相機模型標定
OpenCV中使用的模型是由Kannala提出的一種魚眼相機的一般近似模型。在等距投影模型的基礎(chǔ)上提出來的。下面來詳細分析其魚眼相機模型的提出過程。我們可以將魚眼相機模型的形式統(tǒng)一以等距投影模型的形式來表示,即
rd=fθdr_d=f θ_d rd?=fθd?
對實際的魚眼鏡頭來說,它們不可能精確地按照投影模型來設(shè)計,所以為了方便魚眼相機的標定,Kannala提出了一種魚眼相機的一般多項式近似模型。通過前面的四個模型,可以發(fā)現(xiàn) θdθ_dθd?是θ的奇函數(shù),而且將這些式子按泰勒級數(shù)展開,發(fā)現(xiàn)θdθ_dθd?可以用θ 的奇次多項式表示,即
θd=k0θ+k1θ3+k2θ5+k3θ7+?θ_d=k_0θ+k_1θ^3+k_2θ^5+k_3θ^7+? θd?=k0?θ+k1?θ3+k2?θ5+k3?θ7+?
為了實際計算的方便,需要確定式中θdθ_dθd?取到的次冪數(shù)。Kannala提出取式的前五項即取到的九次方,就給出了足夠的自由度來很好地近似各種投影模型。 θdθ_dθd?的一次項系數(shù)可以為1,于是OpenCV中使用的魚眼相機模型為:
θd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9?θ_d=k_0θ+k_1θ^3+k_2θ^5+k_3θ^7+k_4θ^9? θd?=k0?θ+k1?θ3+k2?θ5+k3?θ7+k4?θ9?
上式表示的模型是根據(jù)四種魚眼相機投影模型得出的一種通用魚眼相機多項式模型。這種模型根據(jù)θ能夠得到 θdθ_dθd?,即通過無畸變圖像中的點能夠計算出魚眼圖像中的畸變點。這種模型在OpenCV的魚眼相機標定方法中是適用的,因為OpenCV借助標定板對魚眼相機進行標定。從空間點到魚眼圖像上的點的變換過程可用式子表示為:
[ Xc &Yc & Zc ] =RX+t
xc=Xc/Zc,yc=Yc/Zcr2=xc2+yc2θd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9?xd=θd/r?xc,yd=θd/r?ycθ=arctan(r)u=fx?xd+cxv=fy?yd+cyx_c=X_c/Z_c, y_c=Y_c/Z_c \\ r_2={x_c}^2 + { y_c}^2 \\ θ_d=k_0θ+k_1θ^3+k_2θ^5+k_3θ^7+k_4θ^9? \\ x_d=θ_d/r*x_c, y_d=θ_d/r*y_c \\ θ=arctan( r ) \\ u=f_x * x_d+c_x \\ v=f_y *y_d+c_y \\ xc?=Xc?/Zc?,yc?=Yc?/Zc?r2?=xc?2+yc?2θd?=k0?θ+k1?θ3+k2?θ5+k3?θ7+k4?θ9?xd?=θd?/r?xc?,yd?=θd?/r?yc?θ=arctan(r)u=fx??xd?+cx?v=fy??yd?+cy?
上面式子中, X表示空間點,XcX_cXc?表示相機坐標系下對應(yīng)的空間點, R和t分別是兩個坐標系之間的旋轉(zhuǎn)矩陣和平移向量,(u,v)T(u,v)^T(u,v)T 表示投影到魚眼圖像上的對應(yīng)點。
OpenCV中對魚眼相機的標定步驟能夠分成四步:
1.求內(nèi)參矩陣的逆,由于攝像機坐標系的三維點到二維圖像平面,需要乘以旋轉(zhuǎn)矩陣R和內(nèi)參矩陣K。那么反向投影回去則是二維圖像坐標乘以 K*R的逆矩陣。
2.將目標圖像中的每一個像素點坐標(j,i),乘以1中求出的逆矩陣iR,轉(zhuǎn)換到攝像機坐標系(_x,_y,_w),并歸一化得到z=1平面下的三維坐標(x,y,1)。
3.求出平面模型下像素點對應(yīng)魚眼半球模型下的極坐標(r, theta)。使用LM算法最小化定位的圖像點和投影的圖像點之間的投影誤差;
4.利用魚眼畸變模型求出擁有畸變時像素點對應(yīng)的theta_d。
5.利用求出的theta_d值將三維坐標點重投影到二維圖像平面得到(u,v),(u,v)即為目標圖像對應(yīng)的畸變圖像中像素點坐標。
6.使用cv::Remap()函數(shù),根據(jù)mapx,mapy取出對應(yīng)坐標位置的像素值賦值給目標圖像,一般采用雙線性插值法,得到畸變校正后的目標圖像。
標定代碼:
鏈接: https://pan.baidu.com/s/1_-RruxBQ5DqDagB3JHYrMA?pwd=93mt 提取碼: 93mt
5. 參考鏈接
[1] https://ieeexplore.ieee.org/document/1333993
[2] https://ieeexplore.ieee.org/document/1642666/citations#citations
[3] https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html
[4] https://blog.csdn.net/KYJL888/article/details/81043133
[5] https://blog.csdn.net/lwx309025167/article/details/103786550
[6] https://blog.csdn.net/u010128736/article/details/52864024/
[7] https://blog.csdn.net/qq_16137569/article/details/112398976
[8] https://blog.csdn.net/waeceo/article/details/51024396
[9] https://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#fisheye-initundistortrectifymap
總結(jié)
- 上一篇: 宽窄多少钱啊?
- 下一篇: 求一个带雨字的qq网名。