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