[英]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.