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

Posted

技术标签:

【中文标题】通过 SVD 从基本矩阵中提取翻译的正确方法【英文标题】:Correct way to extract Translation from Essential Matrix through SVD 【发布时间】:2013-04-03 04:03:09 【问题描述】:

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

** 问题)至此,提出了两种方法,让我很困惑,哪一种真正给出了正确的答案——专门用于翻译:

第一种方法enter link description here作者建议计算R,T如下:

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

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

【问题讨论】:

第二种方法的链接已失效。文档移至:igt.ip.uca.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf 【参考方案1】:

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

[t]x的定义为:

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

【讨论】:

在第一个解决方案中,T1,T2 是非零 3X3 矩阵,但实际上作为平移 t ,我需要 3X1 矩阵。我应该如何从非零 3X3 矩阵中提取 3X1 而不会丢失信息? 如果您使用 SVD 提取翻译,则翻译向量为 SVD(E).u.col(2),如您帖子的第二种方法中所述。你如何提取你的 3x3 翻译矩阵?您也可以查看***.com/questions/16639106/… 了解更多信息 我使用上面提到的第一种方法来提取 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; 因为您使用的是 SVD,所以您的平移向量 (3x1) 是 U 的第三列(decomp.u.col(2) 返回一个 3x1 向量)。通过使用 SVD,您可以获得 4 个可能的解决方案,R 有 2 个,t 有 2 个。要获得两者的正确解决方案,您可以使用三角测量。如果您仔细阅读其他问题,您会看到在 `t1\t2 = decomp.u.col(2);` 和 new_pos = old_pos + -R.t()*t; 之间完成了三角测量(其他问题中提供了链接)。另请阅读 cmets,它指出了 SVD 计算中的错误

以上是关于通过 SVD 从基本矩阵中提取翻译的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

传统机器算法

如何使用 sklearn 获得所有三个 SVD 矩阵?

没办法,SVD就讲的这么好

SVD(奇异值矩阵分解) 转载

翻译View Frustum Culling --3 Clip Space Approach – Extracting the Planes

降维