対応する画像の動きに基づいて新しいカメラの位置を計算しようとしています。 ピンホールカメラモデルに準拠しています。対応する画像からのカメラの動き
実際、私は有益な結果を得ていないので、私は手順を説明し、誰かが私を助けることを願っています。
対応する画像の特徴を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は、ベクトル(3×)である
new_pos = old_pos + -R.t()*t;
は、R回転行列(3×3)とは平行移動ベクトル(3×)をT:
新しい位置
を次いで計算されます。残念ながら私は有用な結果を得ていないので、誰かが間違っている可能性があります。ここで
は、いくつかの結果(念のため、誰かがそれらのいずれかは間違いなく間違っていることを確認することができます)、次のとおりです。
x' * F * x = 0
場合は、あなたのポイントの対応をチェックする必要があり、すべての
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]
計算にもう1つ間違いがあります。 'SVD decomp = SVD(E);'はOKですが、新しい 'newE = U * diag(1,1,0)* Vt'を計算しなければならず、' SVD decomp2 = SVD(newE) ; '。興味深いのは – who9vy
です。私はそれについては決して読んでいない。だからdecomp2でRとtを計算するのですか? btw:詳細なお返事ありがとうございます。私はすべてのことをチェックしなければならず、できるだけ早く反応します。 – 3x14159265
はい、decomp2でRとtを計算する必要があります。詳細な説明はここ(pp 257-260)http://www.robots.ox.ac.uk/~vgg/hzbook/hzbook2/HZepipolar.pdf – who9vy