簡體   English   中英

分解基本矩陣:驗證R和T的四種可能解法

[英]Decomposition of Essential Matrix: Validation of the four possible solutions for R and T

我想使用OpenCV進行動態結構。 到目前為止,我已經有了基本面和基本面。 有了基本矩陣,我正在做SVD以獲取R和T。

我的問題是我為R有2種可能的解決方案,為T有2種可能的解決方案,這導致整個姿勢有4種解決方案,其中4種解決方案中只有一種是正確的。 如何找到正確的解決方案?

這是我的代碼:

private void calculateRT(Mat E, Mat R, Mat T){

    Mat w = new Mat();
    Mat u = new Mat();
    Mat vt = new Mat();

    Mat diag = new Mat(3,3,CvType.CV_64FC1);
    double[] diagVal = {1,0,0,0,1,0,0,0,1};
    diag.put(0, 0, diagVal);

    Mat newE = new Mat(3,3,CvType.CV_64FC1);

    Core.SVDecomp(E, w, u, vt, Core.DECOMP_SVD); 

    Core.gemm(u, diag, 1, vt, 1, newE);

    Core.SVDecomp(newE, w, u, vt, Core.DECOMP_SVD);

    publishProgress("U: " + u.dump());
    publishProgress("W: " + w.dump());
    publishProgress("vt:" + vt.dump());

    double[] W_Values = {0,-1,0,1,0,0,0,0,1};
    Mat W = new Mat(new Size(3,3), CvType.CV_64FC1);
    W.put(0, 0, W_Values);

    double[] Wt_values = {0,1,0-1,0,0,0,0,1};
    Mat Wt = new Mat(new Size(3,3), CvType.CV_64FC1);
    Wt.put(0,0,Wt_values);


    Mat R1 = new Mat();
    Mat R2 = new Mat();

    // u * W * vt = R 
    Core.gemm(u, Wt, 1, vt, 1, R2);
    Core.gemm(u, W, 1, vt, 1, R1);

    publishProgress("R: " + R.dump());


    // +- T (2 possible solutions for T)
    Mat T1 = new Mat();
    Mat T2 = new Mat();
    // T = u.t
    u.col(2).copyTo(T1);

    publishProgress("T : " + T.dump());

    Core.multiply(T, new Scalar(-1.0, -1.0, -1.0), T2);

    // TODO Here I have to find the correct combination for R1 R2 and T1 T2

}

從其基本矩陣重建兩個攝像機的相對歐氏姿勢時,存在理論上的歧義。 這種歧義與以下事實有關:給定圖像中的2D點,經典針孔相機模型無法分辨對應的3D點是在相機前面還是在相機后面。 為了消除這種歧義,您需要知道圖像中的一個點對應關系:由於假設這兩個2D點是位於兩個攝像機前面的單個3D點的投影(因為在兩個圖像中都可見),這樣可以選擇正確的R和T。

為此,在以下博士學位論文的6.1.4(p47)中解釋了一種方法:C.Ressl( PDF )編寫的“三焦點張量的幾何,約束和計算”。 下面概述了此方法。 我將用x1和x2表示兩個相應的2D點,用K1和K2表示兩個相機矩陣,並用E12表示基本矩陣。

一世。 計算基本矩陣E12 = U * S * V'的SVD。 如果det(U) < 0設置U = -U 如果det(V) < 0設置V = -V

II。 定義W = [0,-1,0; 1,0,0; 0,0,1] W = [0,-1,0; 1,0,0; 0,0,1] W = [0,-1,0; 1,0,0; 0,0,1]R2 = U * W * V'T2 = third column of U

III。 定義M = [ R2'*T2 ]xX1 = M * inv(K1) * x1X2 = M * R2' * inv(K2) * x2

IV。 如果X1(3) * X2(3) < 0 ,則設置R2 = U * W' * V'並重新計算MX1

v。如果X1(3) < 0設置T2 = -T2

六。 定義P1_E = K1 * [ I | 0 ] P1_E = K1 * [ I | 0 ]P2_E = K2 * [ R2 | T2 ] P2_E = K2 * [ R2 | T2 ]

符號'表示步驟iii中使用的轉置和符號[.]x 對應於斜對稱運算符。 在3x1向量上應用偏斜對稱算子e = [e_1; e_2; e_3] e = [e_1; e_2; e_3] e = [e_1; e_2; e_3]產生以下結果(請參閱Wikipedia關於叉積的文章 ):

[e]x = [0,-e_3,e_2; e_3,0,-e_1; -e_2,e_1,0]

最后,請注意, T2的范數將始終為1,因為它是正交矩陣的列之一。 這意味着您將無法恢復兩個攝像機之間的真實距離。 為此,您需要知道場景中兩點之間的真實距離,並考慮該距離以計算攝像機之間的真實距離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM