首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV:本质矩阵分解

OpenCV:本质矩阵分解
EN

Stack Overflow用户
提问于 2014-01-20 11:24:02
回答 1查看 5.8K关注 0票数 1

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

代码语言:javascript
复制
<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= 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个点)。

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

EN

回答 1

Stack Overflow用户

发布于 2014-01-21 14:04:00

我看到了两个问题。

首先,扣除第三个对角线项的可忽略值,您的E值比理想项约低6%:err_percent =(21.48-20.29)/ 20.29 * 100。听起来很小,但是从像素错误的角度来看,它可能是一个更大的数目。

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

第二,教科书分解包含4种解决方案,其中只有一种是物理上可行的(即在摄像机前面有3D点)。你可能会撞到其中一个非物质的。见E

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21232734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档