从本质矩阵中通过SVD提取翻译的正确方法

10
我已经校准了我的相机并找到了内在参数(K)。此外,我还计算出了基础矩阵(F)。
现在,E= K_T* F * K。目前为止一切顺利。
现在我们将本质矩阵(E)传递给SVD,使用分解值(U、W、V)来提取旋转和平移:
 essentialMatrix = K.Transpose().Mul(fund).Mul(K);
 CvInvoke.cvSVD(essentialMatrix, wMatrix, uMatrix, vMatrix, Emgu.CV.CvEnum.SVD_TYPE.CV_SVD_DEFAULT);

**问题)目前有两种方法提出了,这让我困惑到底哪一种才能给出正确的答案- 特别是翻译方面:

在第一种方法(链接说明)中,作者建议计算R、T如下所示:

enter image description here

但在第二种方法[http://isit.u-clermont1.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf]中,作者提供了另一种T的公式,即+U,-U如下所示:

enter image description here

我使用openCv库在C# .Net上实现这个问题。请问哪一个翻译公式是正确的?


1
第二种方法的链接已失效。该文档已移至:http://igt.ip.uca.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf - Gabriel Devillers
1个回答

4

在第一个解决方案中,T1和T2是非零的3X3矩阵,但实际上作为一个平移t,我需要一个3X1的矩阵。如何从一个非零的3X3矩阵中提取出3X1矩阵而不丢失信息? - farzin parsa
如果您使用SVD提取翻译向量,则可以使用SVD(E).u.col(2),如您帖子的第二种方法所述。那么如何提取3x3翻译矩阵?您还可以查看https://dev59.com/1mQn5IYBdhLWcg3wr406以获取更多信息。 - pichsenmeister
我使用了上面提到的第一种方法来提取T1,T2,这两者都是3X3. 我做错了什么吗? 在提供的链接中,作者再次从计算t1,t2跳到t的计算而没有提及t1,t2和t之间的转换/关系。如下所述: t1 = decomp.u.col(2); //u3 t2 = -decomp.u.col(2); //u3 new_pos = old_pos + -R.t()*t; - farzin parsa
3
如果你正在使用SVD,你的翻译向量(3x1)是U的第三列(decomp.u.col(2)返回一个3x1向量)。通过使用SVD,你可以得到4种可能的解决方案,其中2个用于R,另外2个用于t。为了获得两者的正确解决方案,你可以使用三角测量。如果你仔细阅读其他问题,你会发现在t1\t2 = decomp.u.col(2);new_pos = old_pos + -R.t()*t;之间进行了三角测量(链接在其他问题中提供)。此外,请阅读评论,其中指出了SVD计算中的错误。 - pichsenmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接