OpenCV:基本矩阵分解

时间:2014-01-20 11:24:02

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

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

<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个点)。

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

1 个答案:

答案 0 :(得分:2)

我看到两个问题。

首先,扣除第三个对角线项的可忽略值,你的E比理想值低6%:err_percent =(21.48 - 20.29)/ 20.29 * 100。听起来很小,但就像素误差而言,它可能是一个相当大的数量。

所以我首先在SVD分解后用理想的E替换E:Er = U * diag(1,1,0)* Vt。

其次,教科书分解允许4种解决方案,其中只有一种在物理上是合理的(即在摄像机前面有3D点)。你可能正在击中一个非物理的。请参阅http://en.wikipedia.org/wiki/Essential_matrix#Determining_R_and_t_from_E