簡體   English   中英

SVD不從立體基本矩陣給出旋轉和平移矩陣

[英]SVD not giving Rotation and Translation matrix from stereo essential matrix

我試圖從基本矩陣中提取旋轉和平移。 我使用內在矩陣來獲得基本矩陣,但 SVD 沒有給出預期的結果。 所以我組合了基本矩陣並嘗試我的 SVD 代碼來獲取旋轉和平移矩陣,發現 SVD 代碼是錯誤的。

我使用旋轉和平移矩陣創建了基本矩陣

R = [[ 0.99965657,  0.02563432, -0.00544263],
        [-0.02596087,  0.99704732, -0.07226806],
        [ 0.00357402,  0.07238453,  0.9973704 ]]
T = [-0.1679611706725666, 0.1475313058767286, -0.9746915198833979]
tx = np.array([[0, -T[2], T[1]], [T[2], 0, -T[0]], [-T[1], T[0], 0]])
E = R.dot(tx)
// E Output: [[-0.02418259,  0.97527093,  0.15178621],
        [-0.96115177, -0.01316561,  0.16363519],
        [-0.21769595, -0.16403593,  0.01268507]]

現在嘗試使用 SVD 取回它。

U,S,V = np.linalg.svd(E)
diag_110 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 0]])
newE = U.dot(diag_110).dot(V.T)
U,S,V = np.linalg.svd(newE)

W = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]])
Z = np.array([[0, 1, 0],[-1,  0,  0],[0,  0,  0]])

R1 = U.dot(W).dot(V.T)
R2 = U.dot(W.T).dot(V.T)

T  = U.dot(Z).dot(U.T);
T = [T[1,0], -T[2, 0], T[2, 1]]

'''
Output
R1 :   [[-0.99965657, -0.00593909,  0.02552386],
        [ 0.02596087, -0.35727319,  0.93363906],
        [-0.00357402, -0.93398105, -0.35730468]]
R2 :   [[-0.90837444, -0.20840016, -0.3625262 ],
        [ 0.26284261,  0.38971602, -0.8826297 ],
        [-0.32522244,  0.89704559,  0.29923163]]
T :    [-0.1679611706725666, 0.1475313058767286, -0.9746915198833979],
'''

SVD 代碼有什么問題? 我在這里這里提到了代碼

您的 R1 輸出是初始(地面實況)旋轉矩陣的左手和軸置換版本:注意第一列與地面實況相反,第二列和第三列交換,並且R1 是 ~= -1(即它是一個左手框架)。

發生這種情況的原因是 SVD 分解返回沒有保證奇偶性的酉矩陣 U 和 V。 此外,您乘以軸置換矩陣 W。由您來翻轉或置換軸,以便旋轉具有正確的旋向性。 您可以通過強制執行圖像和場景中的約束以及已知的攝像機順序(即知道哪個攝像機是左邊的)來實現這一點。

暫無
暫無

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

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