[英]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],
'''
您的 R1 輸出是初始(地面實況)旋轉矩陣的左手和軸置換版本:注意第一列與地面實況相反,第二列和第三列交換,並且R1 是 ~= -1(即它是一個左手框架)。
發生這種情況的原因是 SVD 分解返回沒有保證奇偶性的酉矩陣 U 和 V。 此外,您乘以軸置換矩陣 W。由您來翻轉或置換軸,以便旋轉具有正確的旋向性。 您可以通過強制執行圖像和場景中的約束以及已知的攝像機順序(即知道哪個攝像機是左邊的)來實現這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.