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

far*_*rsa 8 opencv svd emgucv opencvsharp

我校准了相机并找到了内在参数(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);
Run Code Online (Sandbox Code Playgroud)

**问题)此时,已经提出了两种方法,并且让我感到困惑的是哪一种方法确实给出了正确的答案 - 特别是对于翻译:

首先输入链接描述,作者建议计算R,T如下:

在此输入图像描述

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

在此输入图像描述

我正在使用openCv库在C#.Net上实现它.谁知道哪个翻译公式是正确的?

pic*_*ter 4

第一个解决方案显示与向量 t 叉积的矩阵表示(因此第一个解决方案 = [t]x ),而第二个解决方案仅显示平移向量 t (https://en.wikipedia.org/wiki/Essential_matrix) 。

[t]x 的定义为:

在此输入图像描述

(来自http://gandalf-library.sourceforge.net/tutorial/report/img148.png

  • 由于您使用的是 SVD,因此您的平移向量 (3x1) 是 U 的第三列(`decomp.u.col(2)` 返回一个 3x1 向量)。通过使用 SVD,您可以获得 4 个可能的解决方案,其中 2 个用于“R”,2 个用于“t”。要获得两者的正确解决方案,您可以使用三角测量。如果您仔细阅读另一个问题,您会发现在 ` t1\t2 = decomp.u.col(2);` 和 `new_pos = old_pos + -Rt()*t;` 之间三角测量已完成(提供了链接)在其他问题中)。另请阅读评论,其中指出了 SVD 计算中的错误 (3认同)