我试图从本质矩阵中提取旋转矩阵和平移向量。
<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,我认为这是正确的。我在左图和右图上都画了极线,它们都通过相关的点(用于计算基本矩阵的所有16个点)。
任何帮助都将不胜感激。谢谢!
发布于 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。
https://stackoverflow.com/questions/21232734
复制相似问题