多视图几何总结——三角形法
多視圖幾何總結(jié)——三角形法
- 多視圖幾何總結(jié)——三角形法
- 線性三角形法
- (1)齊次方法
- (2)非齊次方法
- 幾何法
- (1)非線性優(yōu)化法
- (2)最優(yōu)解法
- 誤差分析
- 補(bǔ)充:深度濾波器
多視圖幾何總結(jié)——三角形法
在《視覺SLAM十四講》中三角測量那一節(jié)中簡單介紹了下如何通過兩幀中匹配的點(diǎn)獲得空間點(diǎn)深度,這對單目相機(jī)的成像是非常重要的,其證明如下,設(shè)x1x_1x1?,x2x_2x2?分別為兩幀中匹配好的特征點(diǎn)的歸一化坐標(biāo),然后滿足:s1x1=s2Rx2+ts_{1} \boldsymbol{x}_{1}=s_{2} \boldsymbol{R} \boldsymbol{x}_{2}+\boldsymbol{t} s1?x1?=s2?Rx2?+t我們已經(jīng)知道變換矩陣RRR和ttt,然后上面方程左乘一個x1∧x_{1}^{\wedge}x1∧?就可以求得s2s_2s2?,如下:s1x1∧x1=0=s2x1∧Rx2+x1∧ts_{1} \boldsymbol{x}_{1}^{\wedge} \boldsymbol{x}_{1}=0=s_{2} \boldsymbol{x}_{1}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{2}+\boldsymbol{x}_{1}^{\wedge} \boldsymbol{t} s1?x1∧?x1?=0=s2?x1∧?Rx2?+x1∧?t很簡單的,文中也提到由于存在噪聲,上式不一定為零,需要用最小二乘法進(jìn)一步求解,怎么求呢?如下
線性三角形法
在多視圖幾何中對問題的描述稍稍有點(diǎn)不一樣,文中采用攝像機(jī)矩陣描述問題,攝像機(jī)矩陣指的是內(nèi)參和外參合成的矩陣P=KR[I∣?C]\mathrm{P}=\mathrm{KR}[\mathrm{I} |-{\mathrm{C}}] P=KR[I∣?C]對于圖像中的點(diǎn)通過攝像機(jī)矩陣應(yīng)該滿足:x=PXx′=P′X{\mathbf{x}}=\mathrm{P}{\mathbf{X}} \quad {\mathbf{x}}^{\prime}=\mathrm{P'} {\mathbf{X}} x=PXx′=P′X而實際上應(yīng)為噪聲的存在,他們并不滿足基本的對極幾何約束,如下圖所示
我們通過叉乘構(gòu)造基本方程,對第一幅圖像有x×(PX)=0\mathbf{x} \times(\mathrm{PX})=0x×(PX)=0,展開得x(p3?X)?(p1?X)=0y(p3?X)?(p2?X)=0x(p2?X)?y(p1?X)=0\begin{aligned} x\left(\mathbf{p}^{3 \top} \mathbf{X}\right)-\left(\mathbf{p}^{1 \top} \mathbf{X}\right) &=0 \\ y\left(\mathbf{p}^{3 \top} \mathbf{X}\right)-\left(\mathbf{p}^{2 \top} \mathbf{X}\right) &=0 \\ x\left(\mathbf{p}^{2 \top} \mathbf{X}\right)-y\left(\mathbf{p}^{1 \top} \mathbf{X}\right) &=0\end{aligned} x(p3?X)?(p1?X)y(p3?X)?(p2?X)x(p2?X)?y(p1?X)?=0=0=0?其中p1?\mathbf{p}^{1 \top}p1?為攝像機(jī)矩陣的第一行,為4維向量,X\mathbf{X}X是空間點(diǎn)齊次坐標(biāo),為4維向量,是我們的未知量,上述三個方程中有兩個是線性獨(dú)立的,因此我們將其中兩維拿出來與另外一幅圖像組成一個AX=0\mathbf{A} \mathbf{X}=\mathbf{0}AX=0的方程組如下:A=[xp3??p1?yp3??p2?x′p′3??p1?y′p′3??p′2?]\mathrm{A}=\left[ \begin{array}{c}{x \mathbf{p}^{3 \top}-\mathbf{p}^{1 \top}} \\ {y \mathbf{p}^{3 \top}-\mathbf{p}^{2 \top}} \\ {x^{\prime} \mathbf{p}^{\prime 3 \top}-\mathbf{p}^{1 \top}} \\ {y^{\prime} \mathbf{p}^{\prime 3 \top}-\mathbf{p}^{\prime 2 \top}}\end{array}\right] A=?????xp3??p1?yp3??p2?x′p′3??p1?y′p′3??p′2???????在有噪聲的情況下(沒噪聲就沒什么好講的了)求解的方法和我們在多視圖幾何總結(jié)——基礎(chǔ)矩陣、本質(zhì)矩陣和單應(yīng)矩陣的求解過程嗎、介紹的方法一致了,ORB SLAM2里面三角化的過程如下
方法和代碼是對應(yīng)一致的
(1)齊次方法
上述方程組未知量是四維向量但自由度一共只有三個(齊次坐標(biāo)),而系數(shù)矩陣是四維的矩陣,因此是一個冗余方程組,如果將四維向量的約束條件設(shè)為∥X∥=1\|\mathbf{X}\|=1∥X∥=1,這可以將這個視為AX=0\mathbf{A X}=\mathbf{0}AX=0的齊次方程進(jìn)行求解,解法是求是在約束∣∣X∣∣=1||\mathbf{X}||=1∣∣X∣∣=1的最小化范數(shù)∣∣AX∣∣||\mathbf{A}\mathbf{X}||∣∣AX∣∣,即求∣∣AX∣∣/∣∣X∣∣||\mathbf{A}\mathbf{X}||/||\mathbf{X}||∣∣AX∣∣/∣∣X∣∣的最小值問題,該問題解為ATA\mathbf{A}^T\mathbf{A}ATA的最小特征值的特征矢量,也就是A\mathbf{A}A的最小奇異值的奇異矢量
(2)非齊次方法
和上面不同的是,如果將四維向量的約束條件設(shè)為最后一個齊次值為1的話,可以將上述方程構(gòu)造成AX=b\mathbf{A X}=\mathbf{b}AX=b的非齊次方程,那這個求解的方法就是最小二乘法了,沒什么好說的
上面兩種解法中,第一種方法是更好的,結(jié)論和求解單應(yīng)矩陣是相同的,因為第二種方法最后一維實際很接近零的話(點(diǎn)在無窮遠(yuǎn)處),那么求解的結(jié)果就會出現(xiàn)問題
幾何法
這里介紹的所謂幾何法其實類似于重投影誤差,如下圖所示:
即尋求滿足對極幾何約束的點(diǎn)x^\hat{\mathbf{x}}x^和點(diǎn)x^′\hat{\mathbf{x}}^{\prime}x^′使得重投影誤差最小:
C(x,x′)=d(x,x^)2+d(x′,x^′)2\mathcal{C}\left(\mathbf{x}, \mathbf{x}^{\prime}\right)=d(\mathbf{x}, \hat{\mathbf{x}})^{2}+d\left(\mathbf{x}^{\prime}, \hat{\mathbf{x}}^{\prime}\right)^{2}C(x,x′)=d(x,x^)2+d(x′,x^′)2其解法也有如下兩種:
(1)非線性優(yōu)化法
諸如高斯牛頓法、列溫伯格法之列的,常規(guī)的非線性優(yōu)化操作,不在此贅述
(2)最優(yōu)解法
如下圖所示:
我們可以將點(diǎn)到點(diǎn)的距離轉(zhuǎn)化為點(diǎn)到直線的距離:d(x,l)2+d(x′,l′)2d(\mathbf{x}, \mathbf{l})^{2}+d\left(\mathbf{x}^{\prime}, \mathbf{l}^{\prime}\right)^{2} d(x,l)2+d(x′,l′)2具體步驟如下:
(1)用參數(shù)ttt在第一幅圖像中初始化一個對極線l(t)\mathbf{l}(t)l(t)
(2)利用基本矩陣FFF(已知),計算第二幅圖像上對應(yīng)的對極線l′(t)\mathbf{l}^{\prime}(t)l′(t)
(3)把距離函數(shù)d(x,l(t))2+d(x′,l′(t))2d(\mathbf{x}, \mathbf{l}(t))^{2}+d\left(\mathbf{x}^{\prime}, \mathbf{l}^{\prime}(t)\right)^{2}d(x,l(t))2+d(x′,l′(t))2表示為ttt的函數(shù)
(4)求最小化這個函數(shù)的ttt值
其中,第二步的操作如下:
書中結(jié)論8.5:假設(shè)l\mathbf{l}l和l′\mathbf{l}^{\prime}l′是對應(yīng)的對極線,且kkk是不過對極點(diǎn)eee的任何直線,則l\mathbf{l}l和l′\mathbf{l}^{\prime}l′間的關(guān)系是l′=F[k]×l\mathbf{l}^{\prime}=F[k]_×\mathbf{l}l′=F[k]×?l
這個方法和第一種方法不同的是,第一種方法是對點(diǎn)求導(dǎo),涉及到三個變量,這種方法只有一個變量ttt,最后構(gòu)造的一個6次多項式,通過求導(dǎo)的方式可以獲得其最小值。求得ttt之后再求得極線上對應(yīng)的兩個圖像坐標(biāo)點(diǎn),再通過三角法恢復(fù)空間點(diǎn)坐標(biāo)就完成了。
誤差分析
線性三角形法和幾何法比較的話,幾何法獲得誤差會相對更小,但是在ORB SLAM2里面作者是直接三用線性三角法的,幾何法的計算量擺在這兒呢,另外,如下圖所示:
純旋轉(zhuǎn)情況下是無法進(jìn)行三角化的(因為不滿足對極約束的要求),平移量越大誤差會越小,但是平移量過大的話,物體匹配會變困難,這個叫三角測量矛盾
補(bǔ)充:深度濾波器
和三角形法相關(guān)的一個比較有意思的東西叫深度濾波器,SVO的深度估計就是通過深度濾波器實現(xiàn)的,《視覺SLAM十四講》中也有總結(jié),這里也順帶總結(jié)一下:
深度濾波器使用的背景是,在單目中如果想實現(xiàn)稠密或者半稠密的SLAM的話如果對每個點(diǎn)都進(jìn)行三角法估計深度的話是不現(xiàn)實的,因為不可能對圖像中每個點(diǎn)都進(jìn)行匹配,于是就誕生了基于極線搜索和塊匹配技術(shù)的深度濾波器,如下圖:
解釋起來很簡單,就是當(dāng)p1p_1p1?的深度不確定時,p2p_2p2?就成了一個極線段而不是一個點(diǎn),我們在p1p_1p1?和p2p_2p2?周圍取一些像素小塊進(jìn)行匹配,這就是極線搜索和塊匹配技術(shù),塊匹配的話一般是拿灰度值(SAD、SSD、NCC等,具體的可以查書,反正就是相似性的一種計算)進(jìn)行匹配的,匹配完成后就可以進(jìn)行深度濾波,這里假設(shè)p1p_1p1?的深度ddd是滿足高斯分布的P(d)=N(μ,σ2)P(d)=N\left(\mu, \sigma^{2}\right) P(d)=N(μ,σ2)假設(shè)我們匹配好的像素塊的深度同樣滿足高斯分布P(dobs)=N(μobs,σobs2)P\left(d_{o b s}\right)=N\left(\mu_{o b s}, \sigma_{o b s}^{2}\right) P(dobs?)=N(μobs?,σobs2?)這里的濾波就是通過高斯相乘,即μfuse=σobs2μ+σ2μobsσ2+σobs2,σfuse2=σ2σobs2σ2+σobs2\mu_{f u s e}=\frac{\sigma_{o b s}^{2} \mu+\sigma^{2} \mu_{o b s}}{\sigma^{2}+\sigma_{o b s}^{2}}, \quad \sigma_{f u s e}^{2}=\frac{\sigma^{2} \sigma_{o b s}^{2}}{\sigma^{2}+\sigma_{o b s}^{2}} μfuse?=σ2+σobs2?σobs2?μ+σ2μobs??,σfuse2?=σ2+σobs2?σ2σobs2??規(guī)則知道了,那么現(xiàn)在的問題是我們匹配好的像素塊的深度分布怎么計算呢?均值μobs\mu_{obs}μobs?就是像素塊中心確定的深度,方差σobs\sigma_{obs}σobs?計算方法是計算相差一個像素距離的變化值,如下
這里的求解就是高中數(shù)學(xué)知識了,上圖中這幾個變量的關(guān)系是a=p?tα=arccos??p,t?β=arccos??a,?t?\begin{aligned} \boldsymbol{a} &=\boldsymbol{p}-\boldsymbol{t} \\ \alpha &=\arccos \langle\boldsymbol{p}, \boldsymbol{t}\rangle \\ \beta &=\arccos \langle\boldsymbol{a},-\boldsymbol{t}\rangle \end{aligned} aαβ?=p?t=arccos?p,t?=arccos?a,?t??對p2p_2p2?進(jìn)行一個像素的擾動有δβ=arctan?1f\delta \beta=\arctan \frac{1}{f} δβ=arctanf1?因此有β′=β+δβγ=π?α?β′\begin{array}{l}{\beta^{\prime}=\beta+\delta \beta} \\ {\gamma=\pi-\alpha-\beta^{\prime}}\end{array} β′=β+δβγ=π?α?β′?由正弦定理可以求得p’\boldsymbol{p’}p’的大小有∥p′∥=∥t∥sin?β′sin?γ\left\|\boldsymbol{p}^{\prime}\right\|=\|\boldsymbol{t}\| \frac{\sin \beta^{\prime}}{\sin \gamma} ∥p′∥=∥t∥sinγsinβ′?所以有σobs=∥p∥?∥p′∥\sigma_{o b s}=\|\boldsymbol{p}\|-\left\|\boldsymbol{p}^{\prime}\right\| σobs?=∥p∥?∥p′∥上面過程通順之后,我們就不斷進(jìn)行迭代,最后直到深度收斂即可,總結(jié)步驟如下
這里注意的是,稠密SLAM的話還是要對每一個像素值都進(jìn)行深度濾波的,只是說通過深度濾波不需要對每個像素進(jìn)行匹配,其計算量還是很大的。
這篇總結(jié)就到這里啦,歡迎交流~
此外,對SLAM算法感興趣的同學(xué)可以看考我的博客SLAM算法總結(jié)——經(jīng)典SLAM算法框架總結(jié)
總結(jié)
以上是生活随笔為你收集整理的多视图几何总结——三角形法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视觉SLAM总结——后端总结
- 下一篇: 多视图几何总结——单应矩阵和基础矩阵的兼