【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解
目錄
- 前言
- 一.小孔成像模型
- 二.坐標(biāo)系的變換
-
- 1.世界坐標(biāo)系到相機(jī)坐標(biāo)系的變換(剛體變換)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymbol {\hat{x_{c}}}xw?^?→xc?^?]
- 2.相機(jī)坐標(biāo)系到圖像坐標(biāo)系的變換(射影變換,基于小孔成像模型)[xc^→xp^\boldsymbol {\hat{x_{c}}}\rightarrow \boldsymbol {\hat{x_{p}}}xc?^?→xp?^?]
- 3.圖像坐標(biāo)系到像素坐標(biāo)系的變換(平移+單位縮放)[xp^→xs^\boldsymbol {\hat{x_{p}}}\rightarrow \boldsymbol {\hat{x_{s}}}xp?^?→xs?^?]
- 4.總結(jié)
- 三.畸變模型
-
- 1.徑向畸變
- 2.切向畸變
- 3.數(shù)學(xué)模型
- 四.總結(jié)
- 五.寫在最后
- 參考引用
前言
由于本人近期正在展開數(shù)字圖像相關(guān)技術(shù)用于測(cè)量材料形變方向的研究,既然涉及到使用圖像處理參與到測(cè)量或檢測(cè)研究當(dāng)中,就肯定避不開構(gòu)建物空間上的任意一點(diǎn)與相機(jī)所拍攝到的圖像上一點(diǎn)之間的數(shù)學(xué)關(guān)系及數(shù)學(xué)模型。之前有過標(biāo)定經(jīng)驗(yàn)的我只是單純的使用別人封裝好的函數(shù),如今仔細(xì)推導(dǎo)過后才發(fā)現(xiàn)其中奧秘所在。我認(rèn)為想要在一個(gè)技術(shù)上有所創(chuàng)新,最核心的還是能夠?qū)⑵鋵W(xué)的透徹,我希望將自己作為一個(gè)初學(xué)者學(xué)習(xí)和推導(dǎo)該原理的過程記錄下來,也方便之后每一個(gè)涉足該領(lǐng)域知識(shí)的人能更清晰更快的應(yīng)用這些知識(shí)。
本文所寫的內(nèi)容主要參考《學(xué)習(xí)OpenCV 3 》1以及 大奧特曼打小怪獸大佬的博客第六節(jié)、雙目視覺之相機(jī)標(biāo)定2。但是本文的講解思路會(huì)稍有不同,同時(shí)也會(huì)更偏向數(shù)學(xué)推導(dǎo)。如果本文對(duì)你的幫助不大,建議可以看一下提到的書籍與博客,可以提供一些不同角度的講解。
如果您對(duì)于標(biāo)定第一次接觸,我希望您可以帶著下面這兩個(gè)問題在本文的推導(dǎo)中一起思考:
- 為什么要進(jìn)行標(biāo)定?
- 標(biāo)定到底是在計(jì)算什么東西?
本專欄目錄:
- 【相機(jī)標(biāo)定與三維重建原理及實(shí)現(xiàn)】學(xué)習(xí)筆記1——相機(jī)模型數(shù)學(xué)推導(dǎo)詳解
- 【相機(jī)標(biāo)定與三維重建原理及實(shí)現(xiàn)】學(xué)習(xí)筆記2——標(biāo)定的算法與方法
文章中的圖大部分都是我自己繪制的,之后寫論文會(huì)用到,所以目前請(qǐng)不要盜用于商業(yè)用途,謝謝!
由于標(biāo)定的主要目的是建立圖像與實(shí)際被攝物體的變換關(guān)系,因此我們首先需要了解的是照相機(jī)系統(tǒng)數(shù)學(xué)模型——小孔成像模型。
一.小孔成像模型
對(duì)于任意一個(gè)折射型光路的照相機(jī)系統(tǒng),無論其使用的鏡頭透鏡組合有多么復(fù)雜,其都可以被簡(jiǎn)化的看做一個(gè)凸透鏡,而光線通過凸透鏡的光心,其光路不會(huì)發(fā)生偏折。因此照相機(jī)系統(tǒng)可以看做是一個(gè)小孔成像的模型,如下圖所示
整個(gè)數(shù)學(xué)模型的坐標(biāo)系建立在光心OOO上,其中xc^\hat{x_{c}}xc?^?是物空間的一點(diǎn),其發(fā)出或反射的光經(jīng)過光心OOO后會(huì)投影到相機(jī)的感光面上,像點(diǎn)為x′^\hat{x^{'}}x′^,相機(jī)感光面到系統(tǒng)光心的距離為焦距fff,如此一來根據(jù)相似三角形的公式可以得到
?x′f=xczc- \frac{x^{'}}{f}=\frac{x_{c}}{z_{c}} ?fx′?=zc?xc??而這里的負(fù)號(hào)也表示了,此時(shí)獲得的是一個(gè)倒立的像。
由于當(dāng)前關(guān)系式中存在負(fù)號(hào),而且通常相機(jī)輸出給我的圖像都是已經(jīng)做了上下翻轉(zhuǎn)才輸出的,為符合認(rèn)知以及簡(jiǎn)便計(jì)算,我們可以將這個(gè)感光面繞投影中心順時(shí)針旋轉(zhuǎn)180°,將其移動(dòng)到光心前fff的位置,建立一個(gè)新的平面,而這個(gè)平面也就是計(jì)算機(jī)視覺當(dāng)中所采用模型的像面(Image Plane),其與光軸的焦點(diǎn)也稱為“主點(diǎn)”(Principal Point)。這樣一來小孔成像的模型就變?yōu)榱巳缦聢D所示的樣子
這里的xp=x′x_{p}=x^{'}xp?=x′,小孔成像的公式就變?yōu)榱?br /> xpf=xczc\frac{x_{p}}{f}=\frac{x_{c}}{z_{c}} fxp??=zc?xc??這樣一來就消除了負(fù)號(hào),同時(shí)像平面也變?yōu)榱宋覀冋J(rèn)知當(dāng)中的正向圖像。利用上述公式,我們?cè)谝阎渲腥齻€(gè)變量自然就可以求解剩下的未知量,但是這里存在一個(gè)問題,光軸并不是一根實(shí)際的線,而且相機(jī)系統(tǒng)的光心具體在什么位置是難以得到準(zhǔn)確值的,這就意味著在以光心作為坐標(biāo)系(這種坐標(biāo)系稱為相機(jī)坐標(biāo)系)時(shí),盡管已知物空間上一點(diǎn),我們也很難量測(cè)其在這個(gè)坐標(biāo)系下的具體位置(xc,yc,zc)(x_{c},y_{c},z_{c})(xc?,yc?,zc?)。因此我們需要以物空間中的一個(gè)具體位置來建立坐標(biāo)系,而這個(gè)坐標(biāo)系即世界坐標(biāo)系。
除此之外我們還需要注意到,無論相機(jī)坐標(biāo)系也好,還是世界坐標(biāo)系也好,他們都是一個(gè)三維的坐標(biāo)系,但是我們實(shí)際拍攝的圖像只是二維的,也就是說經(jīng)過小孔成像模型投影后得到的像點(diǎn)xpx_{p}xp?我們實(shí)質(zhì)只關(guān)心其前兩個(gè)維度的變量(xp,yp)(x_{p},y_{p})(xp?,yp?)即可,因此可以直接在圖像平面的主點(diǎn)(即圖像的中心)上建立二維的x?yx-yx?y坐標(biāo)系即可,而這個(gè)坐標(biāo)系被稱為圖像坐標(biāo)系。
當(dāng)然,這三個(gè)坐標(biāo)系的度量都是長(zhǎng)度單位(一般采用mm),但我們實(shí)際拿到的數(shù)字圖像單位是像素,而且數(shù)字圖像在PC的存儲(chǔ)是以矩陣的形式存儲(chǔ),矩陣的起始點(diǎn)位于左上角,因此我們要引入在數(shù)字圖像上的計(jì)算還需要以圖像左上角位置建立的,度量單位是像素的坐標(biāo)系,而這個(gè)坐標(biāo)系被稱為像素坐標(biāo)系。其與圖像坐標(biāo)系的差異如下圖所示,u?vu-vu?v坐標(biāo)系為像素坐標(biāo)系,Xp?YpX_{p}-Y_{p}Xp??Yp?坐標(biāo)系為圖像坐標(biāo)系,(cx,cy)(c_{x},c_{y})(cx?,cy?)表示主點(diǎn)PPP在像素坐標(biāo)系下的位置。
通過上面說到的四個(gè)坐標(biāo)系的相互變換,我們即可構(gòu)建數(shù)字圖像上的某個(gè)像素與實(shí)際空間中的具體物點(diǎn)之間的映射關(guān)系了,而標(biāo)定的目的就是去求解在這些坐標(biāo)系相互變換中用到的各種未知量。
二.坐標(biāo)系的變換
1.世界坐標(biāo)系到相機(jī)坐標(biāo)系的變換(剛體變換)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymbol {\hat{x_{c}}}xw?^?→xc?^?]
剛體變換(regidbody motion):三維空間中, 當(dāng)物體不發(fā)生形變時(shí),對(duì)一個(gè)幾何物體作旋轉(zhuǎn), 平移的運(yùn)動(dòng),稱之為剛體變換2。
由于世界坐標(biāo)系和相機(jī)坐標(biāo)系都是右手坐標(biāo)系,兩者之間的轉(zhuǎn)換并不存在形變,僅通過剛體變換的方式即可進(jìn)行相互的轉(zhuǎn)換,設(shè)物空間中一點(diǎn),在世界坐標(biāo)系中的表達(dá)為xw^=[xw,yw,zw]T\boldsymbol {\hat{x_{w}}}=[x_{w},y_{w},z_{w}]^{T}xw?^?=[xw?,yw?,zw?]T,在相機(jī)坐標(biāo)系下的表達(dá)為xc^=[xc,yc,zc]T\boldsymbol {\hat{x_{c}}}=[x_{c},y_{c},z_{c}]^{T}xc?^?=[xc?,yc?,zc?]T,根據(jù)剛體變換的數(shù)學(xué)表達(dá),我們可以得到如下的轉(zhuǎn)換關(guān)系:
[XcYcZc]=[r00r01r02r10r11r12r20r21r22][XwYwZw]+[TxTyTz]\left[\begin{array}{c} X_{c} \\ Y_{c} \\ Z_{c} \end{array}\right]=\left[\begin{array}{lll} r_{00} & r_{01} & r_{02} \\ r_{10} & r_{11} & r_{12} \\ r_{20} & r_{21} & r_{22} \end{array}\right]\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \end{array}\right]+\left[\begin{array}{c} T_{x} \\ T_{y} \\ T_{z} \end{array}\right] ???Xc?Yc?Zc?????=???r00?r10?r20??r01?r11?r21??r02?r12?r22????????Xw?Yw?Zw?????+???Tx?Ty?Tz?????為了讓計(jì)算更加規(guī)整,將這個(gè)線性表示寫為齊次形式(后續(xù)的變換也都采用齊次坐標(biāo)進(jìn)行表達(dá)):
齊次坐標(biāo):把n維空間上的點(diǎn),用(n+1)維的向量進(jìn)行表示。1
[XcYcZc1]=[Rt03T1][XwYwZw1]\left[\begin{array}{c} X_{c} \\ Y_{c} \\ Z_{c} \\ 1 \end{array}\right]=\left[\begin{array}{cc} R & t \\ 0_{3}^{T} & 1 \end{array}\right]\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right] ?????Xc?Yc?Zc?1??????=[R03T??t1?]?????Xw?Yw?Zw?1??????其中,RRR是3×33\times 33×3的正交單位矩陣【三個(gè)列向量?jī)蓛烧?#xff0c;這個(gè)性質(zhì)在后續(xù)標(biāo)定算法中非常重要】被稱為旋轉(zhuǎn)矩陣;ttt為3×13\times 13×1的平移向量。由于這兩者只與相機(jī)系統(tǒng)在世界坐標(biāo)系中所處的位置有關(guān),與系統(tǒng)本身的參數(shù)特性無關(guān),因此,RRR和ttt被稱為外參,[Rt03T1]\left[\begin{array}{cc} R & t \\ 0_{3}^{T} & 1 \end{array}\right][R03T??t1?]被稱為外參矩陣。
2.相機(jī)坐標(biāo)系到圖像坐標(biāo)系的變換(射影變換,基于小孔成像模型)[xc^→xp^\boldsymbol {\hat{x_{c}}}\rightarrow \boldsymbol {\hat{x_{p}}}xc?^?→xp?^?]
利用上一章提到的小孔成像模型,設(shè)物空間中一點(diǎn)xc^\boldsymbol {\hat{x_{c}}}xc?^?經(jīng)鏡頭系統(tǒng)投影到像面的位置為xp^=[xp,yp,1]T\boldsymbol {\hat{x_{p}}}=[x_{p},y_{p},1]^{T}xp?^?=[xp?,yp?,1]T【由于圖像時(shí)二維的,此處做了降維】,我們可以建立從相機(jī)坐標(biāo)系到圖像坐標(biāo)系射影變換的數(shù)學(xué)表達(dá):
[xpyp1]=[f/zc0000f/zc00001/zc0][xcyczc1]\left[\begin{array}{l} x_{p} \\ y_{p} \\ 1 \end{array}\right]=\left[\begin{array}{llll} f/z_{c} & 0 & 0 & 0 \\ 0 & f/z_{c} & 0 & 0 \\ 0 & 0 & 1/z_{c} & 0 \end{array}\right]\left[\begin{array}{c} x_{c} \\ y_{c} \\ z_{c} \\ 1 \end{array}\right] ???xp?yp?1????=???f/zc?00?0f/zc?0?001/zc??000?????????xc?yc?zc?1??????將zcz_{c}zc?提出來放到等式的左側(cè)有:
zc[xpyp1]=[f0000f000010][xcyczc1]z_{c}\left[\begin{array}{l} x_{p} \\ y_{p} \\ 1 \end{array}\right]=\left[\begin{array}{llll} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]\left[\begin{array}{c} x_{c} \\ y_{c} \\ z_{c} \\ 1 \end{array}\right] zc????xp?yp?1????=???f00?0f0?001?000?????????xc?yc?zc?1??????這里的fff即相機(jī)系統(tǒng)的焦距,但它并不是簡(jiǎn)單的鏡頭規(guī)格書上寫好的參數(shù),這是由于鏡頭生產(chǎn)和加工是有偏差的,而且每當(dāng)我們旋鈕定焦鏡頭上的對(duì)焦環(huán)時(shí),都會(huì)造成焦距的輕微變化,這也是為什么每次旋擰完鏡頭對(duì)焦環(huán)后都需要重新標(biāo)定的緣故。注意到這一步為止,矩陣兩邊的單位依然是物理尺寸(如mm)。
3.圖像坐標(biāo)系到像素坐標(biāo)系的變換(平移+單位縮放)[xp^→xs^\boldsymbol {\hat{x_{p}}}\rightarrow \boldsymbol {\hat{x_{s}}}xp?^?→xs?^?]
由于圖像坐標(biāo)系與像素坐標(biāo)系的差異如下圖所示:
要將圖像坐標(biāo)系Xp?YpX_{p}-Y_{p}Xp??Yp?下的表示轉(zhuǎn)換為以左上角為原點(diǎn)的像素坐標(biāo)系u?vu-vu?v的表示,需要進(jìn)行坐標(biāo)系的平移以及尺度單位的縮放。設(shè)圖像坐標(biāo)系圓心PPP(即主點(diǎn))像素坐標(biāo)系下的位置(單位:像素)為(cx,cy)(c_{x},c_{y})(cx?,cy?)【這個(gè)位置在理想模型中即畫面的正中心,但實(shí)際由于相機(jī)Sensor安裝時(shí)候的偏差,畫面正中心的點(diǎn)未必與光軸重合,這導(dǎo)致主點(diǎn)坐標(biāo)并不位于正中間,當(dāng)然,越好的相機(jī)這兩者之間會(huì)越接近】,單位尺寸內(nèi)的像素?cái)?shù)為sx、sys_{x}、s_{y}sx?、sy?(即像元尺寸的倒數(shù),單位:像素/mm)【存在兩個(gè)方向主要是由于Sensor安裝帶來的像面與理想像面的差異 以及 像元在sensor上并不一定是密集排列的,其存在周邊電路造成像元很難是一個(gè)標(biāo)準(zhǔn)的正方形】。這樣一來我們可以得到如下的關(guān)系式:
{u=cx+xp?sxv=cy+yp?sy\left\{\begin{matrix} u=c_{x}+x_{p}\cdot s_{x}\\ v=c_{y}+y_{p}\cdot s_{y} \end{matrix}\right.{u=cx?+xp??sx?v=cy?+yp??sy??將其寫為齊次坐標(biāo)下的表達(dá)
[uv1]=[sx0cx0sycy001][xpyp1]\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{llll} s_{x} & 0 & c_{x}\\ 0 &s_{y}& c_{y}\\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} x_{p} \\ y_{p} \\ 1 \end{array}\right] ???uv1????=???sx?00?0sy?0?cx?cy?1???????xp?yp?1????
4.總結(jié)
通過上面介紹的坐標(biāo)系之間轉(zhuǎn)換過程,我們可以將這三者聯(lián)立相乘,寫為一個(gè)整體有
zc[uv1]=zc[sx0cx0sycy001][xpyp1]=[sx0cx0sycy001][f0000f000010][xcyczc1]=[sx0cx0sycy001][f0000f000010][r00r01r02Txr10r11r12Tyr20r21r22Tz0001][xwywzw1]\begin{aligned} z_{c}\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right] &=z_{c}\left[\begin{array}{ccc} s_{x} & 0 & c_{x}\\ 0 &s_{y}& c_{y}\\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x_{p} \\ y_{p} \\ 1 \end{array}\right]=\left[\begin{array}{ccc} s_{x} & 0 & c_{x}\\ 0 &s_{y}& c_{y}\\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]\left[\begin{array}{c} x_{c} \\ y_{c} \\ z_{c} \\ 1 \end{array}\right] \\ &=\left[\begin{array}{ccc} s_{x} & 0 & c_{x}\\ 0 &s_{y}& c_{y}\\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]\left[\begin{array}{cccc} r_{00} & r_{01} & r_{02} & T_{x} \\ r_{10} & r_{11} & r_{12} & T_{y} \\ r_{20} & r_{21} & r_{22} & T_{z} \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} x_{w} \\ y_{w} \\ z_{w} \\ 1 \end{array}\right] \end{aligned} zc????uv1?????=zc????sx?00?0sy?0?cx?cy?1???????xp?yp?1????=???sx?00?0sy?0?cx?cy?1???????f00?0f0?001?000?????????xc?yc?zc?1??????=???sx?00?0sy?0?cx?cy?1???????f00?0f0?001?000?????????r00?r10?r20?0?r01?r11?r21?0?r02?r12?r22?0?Tx?Ty?Tz?1???????????xw?yw?zw?1???????由于等式中前兩個(gè)矩陣[sx0cx0sycy001],[f0000f000010]\left[\begin{array}{ccc} s_{x} & 0 & c_{x}\\ 0 &s_{y}& c_{y}\\ 0 & 0 & 1 \end{array}\right],\left[\begin{array}{cccc} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]???sx?00?0sy?0?cx?cy?1????,???f00?0f0?001?000????中的參數(shù)只和相機(jī)系統(tǒng)本身的參數(shù)性質(zhì)有關(guān),因此可以將其相乘得到一個(gè)新的矩陣,設(shè)組合量f?sx=fx,f?sy=fyf \cdot s_{x}=f_{x},f \cdot s_{y}=f_{y}f?sx?=fx?,f?sy?=fy?,則上式可以被寫為
zc[uv1]=[fx0cx0fycy001][Rt03T1][xwywzw1]z_{c}\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right] =\left[\begin{array}{ccc} f_{x} & 0 & c_{x}\\ 0 &f_{y}& c_{y}\\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} R & t \\ 0_{3}^{T} & 1 \end{array}\right]\left[\begin{array}{c} x_{w} \\ y_{w} \\ z_{w} \\ 1 \end{array}\right]zc????uv1????=???fx?00?0fy?0?cx?cy?1????[R03T??t1?]?????xw?yw?zw?1??????其中[fx0cx0fycy001]\left[\begin{array}{ccc} f_{x} & 0 & c_{x}\\ 0 &f_{y}& c_{y}\\ 0 & 0 & 1 \end{array}\right]???fx?00?0fy?0?cx?cy?1????被稱為內(nèi)參矩陣(Intrinsic Matrix),fx、fy、cx、cyf_{x} 、f_{y}、c_{x}、c_{y}fx?、fy?、cx?、cy?就是內(nèi)參(Intrinsic Parameters);[Rt03T1]\left[\begin{array}{cc} R & t \\ 0_{3}^{T} & 1 \end{array}\right][R03T??t1?]被稱為外參矩陣(Extrinsic Matrix),RRR和ttt被稱為外參(Extrinsic Parameters)。希望通過這一部分的總結(jié),可以方便讀者之后能很快速的解讀MATLAB或者OpenCV對(duì)相機(jī)標(biāo)定后的結(jié)果。
在部分教材和帖子中,會(huì)將兩個(gè)組合量fx,fyf_{x},f_{y}fx?,fy?說成是相機(jī)系統(tǒng)沿x/yx/yx/y的焦距,但我認(rèn)為這種說法是存在歧義的【
一個(gè)光學(xué)專業(yè)學(xué)生的較真】,因此對(duì)于MATLAB或者OpenCV輸出內(nèi)參矩陣中的fx,fyf_{x},f_{y}fx?,fy?(單位:像素),請(qǐng)不要直接與你采用的鏡頭焦距(單位:mm)作對(duì)比,你需要將fx,fyf_{x},f_{y}fx?,fy?乘以所采用相機(jī)Sensor的像元尺寸(單位:um/像素)后再進(jìn)行比對(duì)。
利用剛剛得到的公式,在通過標(biāo)定確定相機(jī)系統(tǒng)的內(nèi)參和外參之后,我們便可以計(jì)算物空間上任意一點(diǎn)(xw,yw,zw)(x_{w},y_{w},z_{w})(xw?,yw?,zw?)投影到相機(jī)畫面上的像素坐標(biāo)(u,v)(u,v)(u,v)【zcz_{c}zc?可以通過xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymbol {\hat{x_{c}}}xw?^?→xc?^?】得到。但是,反過來通過圖像上一點(diǎn)(u,v)(u,v)(u,v),在相機(jī)系統(tǒng)的內(nèi)參和外參已知的情況下,是無法還原物空間上的精確一點(diǎn)(xw,yw,zw)(x_{w},y_{w},z_{w})(xw?,yw?,zw?)的!!,這是因?yàn)閦cz_{c}zc?此時(shí)是未知量,只有確定zcz_{c}zc?,即已知被攝面到相機(jī)系統(tǒng)的物距或者被攝面相對(duì)于世界坐標(biāo)系的位置時(shí),才能還原物空間的精確一點(diǎn)。
這也從數(shù)學(xué)的角度上說明了,采用單個(gè)常規(guī)相機(jī),在沒有其他輔助手段以及相機(jī)固定(外參固定)的情況下,是無法實(shí)現(xiàn)三維重建的原因,而且即使要實(shí)現(xiàn)準(zhǔn)確的二維測(cè)量,也需要被攝面到相機(jī)的距離已知且固定【工廠采用視覺技術(shù)的自動(dòng)化設(shè)備,一旦攝像機(jī)機(jī)位發(fā)生變化,都是需要重新標(biāo)定的,并且考慮到被攝面到相機(jī)的距離不方便測(cè)量,標(biāo)定時(shí)會(huì)故意將世界坐標(biāo)系建立在被攝面上(這種場(chǎng)景下的標(biāo)定需要將標(biāo)定板厚度考慮進(jìn)來)】
三.畸變模型
從理想情況上來說,在上面的內(nèi)參和外參結(jié)果知道后就可以構(gòu)建圖像與實(shí)際被攝物的映射關(guān)系了,但實(shí)際的相機(jī)系統(tǒng)并不是理想的模型,由于鏡頭本身特性的緣故,以及相機(jī)和鏡頭生產(chǎn)過程中受制造精度和組裝工藝帶來的偏差,造成得到的圖像會(huì)存在失真,而這些失真中對(duì)剛才的投影公式影響最大的就是——畸變。
在計(jì)算機(jī)視覺的相機(jī)模型中,畸變主要分為徑向畸變(由鏡頭本身特性以及制造精度決定)和切向畸變(由相機(jī)和鏡頭的組裝工藝帶來的偏差決定)。
這里需要糾正一下 大奧特曼打小怪獸 博主描述的 “透鏡的畸變主要分為徑向畸變和切向畸變”,鏡頭本身特性帶來的畸變只會(huì)影響徑向畸變,所以切向畸變并不能說是透鏡的畸變。【
一個(gè)光學(xué)專業(yè)學(xué)生對(duì)自己鏡頭設(shè)計(jì)知識(shí)的自信!】
1.徑向畸變
徑向畸變是沿著透鏡半徑方向分布的畸變,由鏡頭本身特性以及制造精度決定,主要影響因素還是鏡頭本身的特性(鏡頭的5種單色像差之一就是畸變),其中視場(chǎng)是徑向畸變重要影響因素,一個(gè)鏡頭其視場(chǎng)角越大,其視場(chǎng)邊緣的畸變也就越大,當(dāng)然廉價(jià)的鏡頭由于對(duì)于鏡頭設(shè)計(jì)優(yōu)化和工裝的要求較低,其畸變也會(huì)很大。這也是為什么大多數(shù)高精度的視覺測(cè)量系統(tǒng)會(huì)采用中長(zhǎng)焦鏡頭(焦距越長(zhǎng)視場(chǎng)越小)的原因了。
折射理論中折射角和入射角的關(guān)系是非線性的,只有在近軸區(qū)域才可以看做是線性關(guān)系(理想成像),遠(yuǎn)離畫面中心的位置這種非線性差異就會(huì)越大(非理想成像),此時(shí)像差也會(huì)越大【有關(guān)鏡頭相關(guān)的知識(shí)今后有空我也做個(gè)匯總好了】
徑向畸變主要包括桶形畸變和枕形畸變兩種。以下分別是枕形和桶形畸變示意圖:
兩種畸變的實(shí)際效果如下:
2.切向畸變
切向畸變是由于感光面(Sensor面)與光軸不垂直所產(chǎn)生的一種畸變,這種畸變由相機(jī)和鏡頭的組裝工藝帶來的偏差決定(相機(jī)安裝的偏差帶來實(shí)際感光面與理想像面的不平行,鏡頭安裝的偏差導(dǎo)致實(shí)際光軸與理想光軸的不重合),這種偏差的示意圖如下圖所示3:
3.數(shù)學(xué)模型
上述兩種畸變反應(yīng)在圖像上就是圖像邊緣的像素點(diǎn)相對(duì)于理想模型下的像素點(diǎn)會(huì)有位置的偏移,導(dǎo)致投影公式計(jì)算得到的不夠準(zhǔn)確。同時(shí)由于兩種畸變無一例外都是圖像中心畸變很小,但是越往外畸變?cè)酱?#xff0c;因此畸變的數(shù)學(xué)模型可以建立在以主點(diǎn)為原點(diǎn)的圖像坐標(biāo)系上,如下圖所示:
其中(x,y)(x,y)(x,y)表示在理想圖像平面下的像素點(diǎn)坐標(biāo),rrr表示理想像素點(diǎn)距離圖像中心(即主點(diǎn)PPP)的距離。設(shè)經(jīng)過畸變之后,在實(shí)際圖像平面上對(duì)應(yīng)的點(diǎn)為(xdist,ydist)(x_{dist},y_{dist})(xdist?,ydist?),則可以有如下的關(guān)系式:
{xdist=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydist=y(1+k1r2+k2r4+k3r6)+p2(r2+2y2)+2p2xy\left\{\begin{matrix} x_{dist}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)+2 p_{1} x y+p_{2}\left(r^{2}+2 x^{2}\right)\\ y_{dist}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)+p_{2}\left(r^{2}+2 y^{2}\right)+2 p_{2} x y \end{matrix}\right.{xdist?=x(1+k1?r2+k2?r4+k3?r6)+2p1?xy+p2?(r2+2x2)ydist?=y(1+k1?r2+k2?r4+k3?r6)+p2?(r2+2y2)+2p2?xy?其中k1,k2,k3k_{1},k_{2},k_{3}k1?,k2?,k3?用于描述徑向畸變,是對(duì)主點(diǎn)周圍進(jìn)行泰勒級(jí)數(shù)展開后的前3項(xiàng),當(dāng)k>0k>0k>0時(shí),距離主點(diǎn)越遠(yuǎn)的點(diǎn)受畸變影響其向外偏離的程度就越大,此時(shí)為枕形畸變(正畸變);反之,當(dāng)k<0k<0k<0時(shí),距離主點(diǎn)越遠(yuǎn)的點(diǎn)受畸變影響其向內(nèi)偏離的程度就越大,此時(shí)為桶形畸變(負(fù)畸變)。
理論上來說,徑向畸變的描述可以無限展開,但是意義不大,一般的系統(tǒng)進(jìn)行圖像矯正采用前兩項(xiàng)即可,大畸變系統(tǒng)會(huì)需要第三項(xiàng)也參與計(jì)算
p1,p2p_{1} ,p_{2}p1?,p2?用于描述切向畸變,其具體的由來可以參考“鉛錘”模型,詳見4。這5個(gè)參數(shù)由于都是相機(jī)系統(tǒng)內(nèi)部特性帶來的參數(shù),故也算是相機(jī)內(nèi)參的一部分。
注:在Opencv中他們被排列成一個(gè)5×1的矩陣,依次包含k1,k2,p1,p2,k3k_{1},k_{2},p_{1} ,p_{2},k_{3}k1?,k2?,p1?,p2?,k3?,利用這5個(gè)參數(shù)即可校正由于畸變導(dǎo)致的圖像形變失真。
四.總結(jié)
通過上面的推導(dǎo),我們可以總結(jié)一下,要實(shí)現(xiàn)從物空間任意一點(diǎn)到相機(jī)圖像的投影我們需要計(jì)算得到哪些參數(shù):
-
內(nèi)參:fx,fyf_{x},f_{y}fx?,fy?(焦距與X/YX/YX/Y方向的像元尺寸倒數(shù)的乘積),cx、cyc_{x}、c_{y}cx?、cy?(主點(diǎn)在像素坐標(biāo)系下的坐標(biāo)位置),k1,k2,k3k_{1},k_{2},k_{3}k1?,k2?,k3?(描述徑向畸變的參數(shù)),p1,p2p_{1} ,p_{2}p1?,p2?(描述切向畸變的參數(shù))
-
外參:RRR(3x3旋轉(zhuǎn)矩陣),ttt(3x1平移向量)
利用相機(jī)標(biāo)定的算法,我們可以求解出這些參數(shù),從而可以實(shí)現(xiàn)從像到物或從物到像的相互映射。
五.寫在最后
其實(shí)現(xiàn)在關(guān)于相機(jī)標(biāo)定有非常多的資料,但我還是啰啰嗦嗦的寫了這篇帖子,主要還是想要把這一塊知識(shí)能理得更順,將很多參考資料中省略掉的那些過渡進(jìn)行一個(gè)補(bǔ)充,希望能方便更多和我一樣的初學(xué)者能從中將這知識(shí)吃的更透徹,而不是只見山之一貌,海之一角,片面的看待問題。里面很多過渡屬于是我自己的推導(dǎo),如果有片面或者不夠準(zhǔn)確的地方,希望該領(lǐng)域的大佬們能幫忙提點(diǎn)出來,確保知識(shí)輸出的準(zhǔn)確與客觀。
參考引用
-
凱勒, 布拉德斯基, 劉昌祥, 吳雨培, and 王成龍. 學(xué)習(xí)OpenCV 3 中文版. 北京: 清華大學(xué)出版社, 2018. ↩? ↩?
-
第六節(jié)、雙目視覺之相機(jī)標(biāo)定 ↩? ↩?
-
Chiou G N. Reducing the Variance of Intrinsic Camera Calibration Results in the ROS Camera_Calibration Package[J]. Masters Thesis, 2017: 9. ↩?
-
Brown D C. Decentering distortion of lenses[J]. Photogrammetric Engineering and Remote Sensing, 1966. ↩?
總結(jié)
以上是生活随笔為你收集整理的【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作为PM,PMP证书重要吗?
- 下一篇: python 取模是什么意思_编程语言中