繁体   English   中英

OpenCV:基本矩阵分解

[英]OpenCV: Essential Matrix Decomposition

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

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

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

我看到两个问题。

首先,将第三个对角线项的值忽略不计,您的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM