【问题标题】:OpenCV: Essential Matrix DecompositionOpenCV:基本矩阵分解
【发布时间】:2014-02-09 13:09:11
【问题描述】:

我正在尝试从基本矩阵中提取旋转矩阵和平移向量。

<pre><code>
SVD svd(E,SVD::MODIFY_A);
Mat svd_u = svd.u;
Mat svd_vt = svd.vt;
Mat svd_w = svd.w;

Matx33d W(0,-1,0,
          1,0,0,
          0,0,1);

Mat_<double> R = svd_u * Mat(W).t() * svd_vt; //or svd_u * Mat(W) * svd_vt; 
Mat_<double> t = svd_u.col(2); //or -svd_u.col(2)
</code></pre>

但是,当我使用 R 和 T 时(例如,获得校正图像),结果似乎不正确(黑色图像或一些明显错误的输出),即使我使用了可能的 R 和 T 的不同组合。

我怀疑E。根据教科书,如果我们有,我的计算是正确的:

E = U*diag(1, 1, 0)*Vt

在我的情况下,svd.w 应该是 diag(1, 1, 0) [至少在比例方面],但并非如此。这是我的输出示例:

svd.w = [21.47903827647813; 20.28555196246256; 5.167099204708699e-010]

此外,E 的两个特征值应该相等,第三个应该为零。在同样的情况下,结果是:

E 的特征值 = 0.0000 + 0.0000i, 0.3143 +20.8610i, 0.3143 -20.8610i

如您所见,其中两个是复共轭。

现在,问题是:

  • E的分解和R、T的计算是否正确?
  • 如果计算正确,为什么结果不满足本质矩阵的内部规则?
  • 如果E、R、T一切正常,为什么他们得到的校正后的图像不正确?

我从基本矩阵中得到 E,我认为这是正确的。我在左右图像上都画了极线,它们都通过相关点(用于计算基本矩阵的所有 16 个点)。

任何帮助将不胜感激。 谢谢!

【问题讨论】:

  • 请记住,基本矩阵中不止一个可能的旋转矩阵 R,并且您无法获得平移向量的真实比例,而只能获得其方向。

标签: opencv image-processing computer-vision svd 3d-reconstruction


【解决方案1】:

我看到两个问题。

首先,扣除第三个对角线项的可忽略值,您的 E 大约比理想值低 6%:err_percent = (21.48 - 20.29) / 20.29 * 100 。听起来很小,但如果换算成像素误差,它可能会更大。

因此,我首先将 E 替换为 SVD 分解后的理想 E:Er = U * diag(1,1,0) * Vt。

其次,教科书分解承认 4 种解决方案,其中只有一种在物理上是合理的(即在相机前面有 3D 点)。你可能会碰到一个非物理的。见http://en.wikipedia.org/wiki/Essential_matrix#Determining_R_and_t_from_E

【讨论】:

  • Francesco,谢谢你的回答。关于用 Er 代替 E,这样做总是可以的吗?我的意思是,我们正在更改基于相机参数计算的基本矩阵。它不会导致新的错误吗?另外,您对将复共轭作为 E 的奇异值有任何想法吗?我计算了 Er,仍然奇异值包含两个复共轭和一个零(而不是两个相等的值和一个零)。最后,我尝试了所有 4 个可能的答案。输出发生了变化,但仍然不正确。
  • 我相信这是一个完美的本质矩阵,如果两个奇异值相等且第三个为零:diag(l,l,0)。我读了很多关于规模的歧义,所以我相信 diag(1,1,0) 和 diag(21,21,0) 或 diag(20,20,0) 都同样“好”,但是diag(1,1,0) 是理想的(总体规模不明确)。我有类似的问题,如果我执行以下操作,我只会得到对我有意义的结果:我不交换 x/y 值,也不反转第一个坐标。另见answers.opencv.org/question/38340/…
猜你喜欢
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2012-04-27
  • 2013-12-26
  • 2012-10-15
相关资源
最近更新 更多