【发布时间】:2013-05-14 09:30:48
【问题描述】:
我正在尝试根据相应图像的运动来计算新的相机位置。 图像符合针孔相机模型。
事实上,我没有得到有用的结果,所以我尝试描述我的过程,希望有人可以帮助我。
我用SIFT匹配对应图像的特征,用OpenCV的FlannBasedMatcher匹配它们,用OpenCV的findFundamentalMat(方法RANSAC)计算基本矩阵。
然后我通过相机内在矩阵(K)计算本质矩阵:
Mat E = K.t() * F * K;
我用奇异值分解将本质矩阵分解为旋转和平移:
SVD decomp = SVD(E);
Matx33d W(0,-1,0,
1,0,0,
0,0,1);
Matx33d Wt(0,1,0,
-1,0,0,
0,0,1);
R1 = decomp.u * Mat(W) * decomp.vt;
R2 = decomp.u * Mat(Wt) * decomp.vt;
t1 = decomp.u.col(2); //u3
t2 = -decomp.u.col(2); //u3
然后我尝试通过三角测量找到正确的解决方案。 (这部分来自http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/,所以我认为应该可以正常工作)。
然后计算新位置:
new_pos = old_pos + -R.t()*t;
其中 new_pos 和 old_pos 是向量 (3x1),R 是旋转矩阵 (3x3),t 是平移向量 (3x1)。
不幸的是,我没有得到有用的结果,所以也许有人知道可能出了什么问题。
以下是一些结果(以防有人可以确认其中任何一个肯定是错误的):
F = [8.093827077399547e-07, 1.102681999632987e-06, -0.0007939604310854831;
1.29246107737264e-06, 1.492629957878578e-06, -0.001211264339006535;
-0.001052930954975217, -0.001278667878010564, 1]
K = [150, 0, 300;
0, 150, 400;
0, 0, 1]
E = [0.01821111092414898, 0.02481034499174221, -0.01651092283654529;
0.02908037424088439, 0.03358417405226801, -0.03397110489649674;
-0.04396975675562629, -0.05262169424538553, 0.04904210357279387]
t = [0.2970648246214448; 0.7352053067682792; 0.6092828956013705]
R = [0.2048034356172475, 0.4709818957303019, -0.858039396912323;
-0.8690270040802598, -0.3158728880490416, -0.3808101689488421;
-0.4503860776474556, 0.8236506374002566, 0.3446041331317597]
【问题讨论】:
-
您的计算中还有一个错误。
SVD decomp = SVD(E);可以,但你必须计算一个新的newE = U*diag(1,1,0)*Vt,然后你必须再次得到SVD decomp2 = SVD(newE);。 -
有趣。我从来没有读过这件事。所以我必须用 decomp2 计算 R 和 t 吗?顺便说一句:感谢您的详细回答。我必须检查所有的东西,并会尽快回复。
-
是的,你必须用 decomp2 计算 R 和 t。这里给出了详细的描述(pp 257-260)robots.ox.ac.uk/~vgg/hzbook/hzbook2/HZepipolar.pdf
标签: opencv rotation translation motion 3d-reconstruction