日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多视图几何总结——三角形法

發(fā)布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多视图几何总结——三角形法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

多視圖幾何總結(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)知道變換矩陣RRRttt,然后上面方程左乘一個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=PX而實際上應(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?xp3??p1?yp3??p2???????在有噪聲的情況下(沒噪聲就沒什么好講的了)求解的方法和我們在多視圖幾何總結(jié)——基礎(chǔ)矩陣、本質(zhì)矩陣和單應(yīng)矩陣的求解過程嗎、介紹的方法一致了,ORB SLAM2里面三角化的過程如下

void Initializer::Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D) {cv::Mat A(4,4,CV_32F);A.row(0) = kp1.pt.x*P1.row(2)-P1.row(0);A.row(1) = kp1.pt.y*P1.row(2)-P1.row(1);A.row(2) = kp2.pt.x*P2.row(2)-P2.row(0);A.row(3) = kp2.pt.y*P2.row(2)-P2.row(1);cv::Mat u,w,vt;cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV);x3D = vt.row(3).t();x3D = x3D.rowRange(0,3)/x3D.at<float>(3); }

方法和代碼是對應(yīng)一致的

(1)齊次方法

上述方程組未知量是四維向量但自由度一共只有三個(齊次坐標(biāo)),而系數(shù)矩陣是四維的矩陣,因此是一個冗余方程組,如果將四維向量的約束條件設(shè)為∥X∥=1\|\mathbf{X}\|=1X=1,這可以將這個視為AX=0\mathbf{A X}=\mathbf{0}AX=0的齊次方程進(jìn)行求解,解法是求是在約束∣∣X∣∣=1||\mathbf{X}||=1X=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}ll′\mathbf{l}^{\prime}l是對應(yīng)的對極線,且kkk是不過對極點(diǎn)eee的任何直線,則l\mathbf{l}ll′\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=tsinγsinβ?所以有σobs=∥p∥?∥p′∥\sigma_{o b s}=\|\boldsymbol{p}\|-\left\|\boldsymbol{p}^{\prime}\right\| σobs?=p?p上面過程通順之后,我們就不斷進(jìn)行迭代,最后直到深度收斂即可,總結(jié)步驟如下

  • 假設(shè)所有像素的深度滿足某個初始的高斯分布;
  • 當(dāng)新數(shù)據(jù)產(chǎn)生時,通過極線搜索和塊匹配確定投影點(diǎn)位置;
  • 根據(jù)幾何關(guān)系計算三角化后的深度以及不確定性;
  • 將當(dāng)前觀測融合進(jìn)上一次的估計中。若收斂則停止計算,否則返回 2
  • 這里注意的是,稠密SLAM的話還是要對每一個像素值都進(jìn)行深度濾波的,只是說通過深度濾波不需要對每個像素進(jìn)行匹配,其計算量還是很大的。

    這篇總結(jié)就到這里啦,歡迎交流~

    此外,對SLAM算法感興趣的同學(xué)可以看考我的博客SLAM算法總結(jié)——經(jīng)典SLAM算法框架總結(jié)

    總結(jié)

    以上是生活随笔為你收集整理的多视图几何总结——三角形法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。