2D-2D 3D-2D 3D-3D 相機位姿估計


1.2D-2D對極幾何

輸入:相機內參、像素匹配點對,輸出:相機位姿

1.1本質矩陣

\(E\) 矩陣 \(E=t^{\wedge} R\)

對極約束:\(x_2^Tt^{\wedge} Rx_1=0\)\(x_1,x_2\)都是相機系歸一化點坐標。

推導:\(z_1x_1=P_w,z_2x_2=RP_w+t\)

\(x_2^{\wedge}t^{\wedge}z_2x_2=x_2^{\wedge}t^{\wedge}Rz_1x_1=0\)

1.2基礎矩陣

\(p_2^TK^{-T}t^{\wedge} RK^{-1}p_1=0\)\(p_1,p_2\)都是像素坐標。

\(E\) 矩陣、\(F\) 矩陣只相差了相機內參:\(F=K^{-T}x_2^Tt^{\wedge} Rx_1K^{-1}\)

8對點法,線性最小二乘法,即可求解。

1.3單應矩陣

\(H\) 矩陣(Homography):描述的是兩個平面之間的映射關系,如果場景中的特征點都落在同一平面上(比如牆面、地面),則可以通過單應性進行運動估計。

\(p_2=Hp_1\)

4對匹配點即可求解。

1.4 自由度

秩與自由度(方陣\(A_{n*n}\)):

矩陣的秩,指的是經過初等變換之后的非零行(列)的個數,若不存在零行(列),則為滿秩矩陣\(Rank(A)=n\);關於矩陣的秩的另一種理解:A矩陣將n維空間中的向量映射到k(k<=n)維空間中,\(k=Rank(A)\)

矩陣(參數矩陣)的自由度,指的是要想求解出矩陣的所有元素至少需要列幾個線性方程組。若矩陣本身帶有 x 個約束,則只需要列\((n*n-x)\)個方程組即可求出所有參數,即矩陣A的自由度為\((n*n-x)\)

  • 1.尺度等價性要減少一個自由度?

以基礎矩陣為例,\(F\) 矩陣滿足:

由於等式右側是0,乘以任意常數以后還是表示同樣兩點之間的變換,所以是F是尺度等價的。

(對於9個參數的向量e,我們只需要通過8個方程計算出其中8個未知數即可, 8個數都用第9個數表示,由於尺度等價,所以第9個數取什么值都是對的)

  • 2.為什么\(E\) 矩陣的秩為2?

\(E=t^{\wedge} R\)

一個矩陣乘以可逆矩陣秩不變,因為可逆矩陣可以表示為初等矩陣的乘積,而初等變換不改變矩陣的秩。

\(Rank(R)=3\)

對於\(t^{\wedge}\):

\(\left[ \begin{matrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1\\ -t_2 & t_1 &0 \end{matrix} \right] \rightarrow \left[ \begin{matrix} 0 & -t_3 & t_2 \\ t_2t_3 & 0 & -t_1t_2\\ -t_2t_3 & t_1t_3 &0 \end{matrix} \right] \rightarrow \left[ \begin{matrix} 0 & -t_3t_1 & t_2t_1 \\ 0 & t_1t_3 & -t_1t_2\\ -t_2t_3 & t_1t_3 &0 \end{matrix} \right] \rightarrow \left[ \begin{matrix} 0 & 0 & 0 \\ 0 & t_3 & -t_2\\ -t_2 & t_1 &0 \end{matrix} \right]\)

\(Rank(t^{\wedge})=2\)

  • 3.為什么\(F\) 矩陣的秩為2?

\(F=K_r^{-T}t^{\wedge} RK_l^{-1}\)

因為兩個相機的內參矩陣和旋轉矩陣都是滿秩(可逆)矩陣,\(Rank(t^{\wedge})=2\),所以\(Rank(F)=2\).

  • 4.為什么\(F\) 矩陣的自由度為7,\(E\) 矩陣的自由度為5,\(H\) 矩陣的自由度為8?

\(F\) 矩陣:

左右相機內參的待定參數各為4;平移參數是3;旋轉矩陣R的自由度是3,所以待定參數是3;

加在一起是14個參數,也就是正常來說把14個參數都確定了才能確定F,但是實際上F是一個\(3*3\)的矩陣,只包含9個參數,所以計算F的自由度最大是9,也就是9個參數就可以確定F。

同時F滿足下面兩個約束:(1)尺度等價性,(2)\(det(F)=0\),所以自由度為9-2=7。

\(E\) 矩陣:

平移的待定參數是3,旋轉矩陣R的自由度是3,所以待定參數是3,共6個參數,也就是要想確定E矩陣,確定6個參數就夠了,不用考慮矩陣的所有9個參數。

同時E滿足下面約束:(1)尺度等價性,所以自由度是6-1=5。

\(H\) 矩陣:

\(H\) 矩陣具有尺度等價性:9-1=8。

1.5總結

  • 尺度不確定性:對t長度的歸一化,直接導致單目視覺的尺度不確定性

  • 初始化的純旋轉問題
    單目視覺初始化不能只有純旋轉,必須要有一定程度的平移。如果沒有平移,從E分解到R,t的過程中,導致t為零,那么得到的E也為零,這將導致無法求解R。不過此時可以依靠H求取旋轉,但是僅僅有旋轉時,無法使用三角測量估計特征點的空間位置。

  • 單應矩陣和本質矩陣使用情景區別
    單應矩陣用於場景的特征點都落在同一個平面上的時候使用,比如牆,地面,可以通過單應性來估計運動,因為當特征點共面的時候,基礎矩陣的自由度下降也就是出現退化現象。
    本質矩陣用於估計特征點不共面的情況下。

2.三角測量

已知:相機內參,兩幀相機外參\(T_1\)\(T_2\),像素匹配點對\(uv_1\)\(uv_2\)
求:像素點對應的世界點
方法:
根據內參,計算像素點對應的相機系歸一化點\(p_1\)\(p_2\)(\(x_c\)\(y_c\))
根據\(z_1*p_1=T_1*P_w\)
\(z_2*p_2=T_2*P_w\)
叉乘:

\[\left\{ \begin{matrix} (p_{1})_{×}*T_1 \\ (p_{2})_{×}*T_2 \end{matrix} \right\} * P_w = 0 \]

​ 第一個式子:

\[ (p_{1})_{×}*T_1* P_w = \left\{ \begin{matrix} 0 & -1 & y1_c \\ 1 & 0 & -x1_c \\ -y1_c & x1_c & 0 \end{matrix} \right\} * \left\{ \begin{matrix} T1_1 \\ T1_2 \\ T1_3 \end{matrix} \right\} *P_w=0 \]

\(T1_1、T1_2、T1_3\)都是1×4,是矩陣T1(3*4)的第1,2,3行。
​ 可得到:

\[\left\{ \begin{matrix} T1_2-y1_c*T1_3 \\ T1_1-x1_c*T1_3 \end{matrix} \right\} *P_w =0 \]

​ 同理,第二個式子可得到

\[\left\{ \begin{matrix} T2_2-y2_c*T2_3 \\ T2_1-x2_c*T2_3 \end{matrix} \right\} *P_w =0 \]

​ 綜合:

\[\left\{ \begin{matrix} T1_2-y1_c*T1_3 \\ T1_1-x1_c*T1_3 \\ T2_2-y2_c*T2_3 \\ T2_1-x2_c*T2_3 \end{matrix} \right\} *P_w =0 \]

for(int i=0;i<n;i++)
    {
        cv::KeyPoint kp1 = vKFs[0].mvKeys[i];
        cv::KeyPoint kp2 = vKFs[1].mvKeys[i];
        cv::Mat xn1 = (cv::Mat_<float>(3,1) << (kp1.pt.x-cx)*invfx, (kp1.pt.y-cy)*invfy, 1.0);
        cv::Mat xn2 = (cv::Mat_<float>(3,1) << (kp2.pt.x-cx)*invfx, (kp2.pt.y-cy)*invfy, 1.0);

        cv::Mat A(4,4,CV_32F);
        A.row(0) = xn1.at<float>(0)*Tcw1.row(2)-Tcw1.row(0);
        A.row(1) = xn1.at<float>(1)*Tcw1.row(2)-Tcw1.row(1);
        A.row(2) = xn2.at<float>(0)*Tcw2.row(2)-Tcw2.row(0);
        A.row(3) = xn2.at<float>(1)*Tcw2.row(2)-Tcw2.row(1);

        cv::Mat w,u,vt;
        cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV);

        cv::Mat x3D = vt.row(3).t();
        x3D = x3D.rowRange(0,3)/x3D.at<float>(3);
        cout<<i<<","<<x3D.t()<<endl;
    }

總結:

  • 1.三角測量是平移得到的,純旋轉無法使用三角測量。
  • 2.當平移很小時,像素上的不確定性將導致較大的深度不確定性。

3.3D-2D

PnP(perspective n points)

輸入:3d空間點 2d像素點,輸出:相機的位姿

(1)直接線性變換DLT:
最少通過6對匹配點實現矩陣TT的線性求解,當匹配點多於6對時,可以使用SVDSVD對超定方程求最小二乘解。
(2)3對點估計位姿的P3P:
3D−2D匹配點,3D點是A,B,C(世界坐標系中坐標),2D點是a,b,c(成像平面像素坐標)
P3P只利用3個點的信息,當給定匹配點多余3組時,難以利用更多信息。
如果3D點或者2D點受噪聲影響,或者存在誤匹配,算法失效。
在SLAM中,通常先使用 P3P/EPnP等方法估計相機位姿,然后構建最小二乘優化問題對估計值進行調整(Bundle Adjustment)。
(3)使用BundleAdjustment優化求解位姿

4.3D-3D

ICP估計相機位姿
根據一組已經匹配好的3D點,\(P={p_1,..,p_n},P′={p_1′,..,p_n′}\)
從中找到一個歐氏變換的R,t,使得任意i滿足\(p_i=Rp_i'+t\)
和PnP類似,ICP有兩種解法:
線性代數求解(SVD方法)、非線性優化方法(類似於Bundle Adjustment)

5.旋轉矩陣

\(P_c=T_{cw}*P_w\)

  • 相機位置

    要獲得當前相機所在的世界點:\(P_c\)為0,\(P_w = T_{wc}*[0,0,0,1]\)

  • 矩陣連乘
    已知\(b= [r_1,t_1;0,1]*a = T_{ba}*a\)
    \(c= [r_{2},t_{2};0,1]*b = T_{cb}*b\)

    \(c= T_{cb}*T_{ba}*a\)
    \(= r_{2}*r_{1}*a+r_{2}*t_{1}+t_{2}\)
    \(= [r_{2}*r_{1},r_{2}*t_{1}+t_{2};0,1]*a\)
    或者已知\(T_{c1w}\)(\(r_1,t_1\))、\(T_{c2w}\)(\(r_2,t_2\))
    轉化到第一幀為基准系:
    \(T_{c1c1}\)為單位幀
    \(T_{wc1}=(r_{1}^t,-r_{1}^t*t_1)\)
    \(T_{c2c1}=T_{c2w}*T_{wc1}=[r_2*r_{1}^t,-r_2*r_{1}^t*t_1+t_2;0,1]\)

  • 添加尺度:
    \(P_2=T_{21}T_{1w}P_w=(r_1,s_1,t_1)(r_2,s_2,t_2)P_w=r_1s_1(r_2s_2P_w+t_2)+t_1 =r_1r_2s_1s_2P_w+r_1s_1t_2+t_1\)
    所以:\(R=r_1r_2,t=\frac {r_1s_1t_2+t_1}{s_1s_2}\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM