0

C++ で OpenCV を使用して、同じカメラから撮影した 2 つの画像から 3D モデルを見つけようとしています。私はこの方法に従いました。R と T の計算の間違いをまだ修正できていません。

画像 1: 不一致をなくすために背景を削除

画像

画像 2: 画像 1 に対して X 方向にのみ変換され、不一致をなくすために背景が削除されています

画像

MATLAB Toolbox を使用して Intrinsic Camera Matrix (K) を見つけました。私はそれが次のようであることがわかりました:

K=

[3058.8    0    -500

0       3057.3   488

0       0         1]

すべての画像マッチング キーポイント (SIFT および BruteForce マッチング、Mismatches Eliminated を使用) は、次のように画像の中心に合わせて配置されました。

obj_points.push_back(Point2f(keypoints1[symMatches[i].queryIdx].pt.x - image1.cols / 2, -1 * (keypoints1[symMatches[i].queryIdx].pt.y - image1.rows / 2)));
scene_points.push_back(Point2f(keypoints2[symMatches[i].trainIdx].pt.x - image1.cols / 2, -1 * (keypoints2[symMatches[i].trainIdx].pt.y - image1.rows / 2)));

Point Correspondeces から、OpenCV で RANSAC を使用する Fundamental Matrix を見つけました

基本マトリックス:

[0             0      -0.0014
 
0              0       0.0028

0.00149    -0.00572      1  ]

以下を使用して得られたエッセンシャル マトリックス:

E = (camera_Intrinsic.t())*f*camera_Intrinsic;

E が得られました:

[ 0.0094        36.290       1.507

-37.2245        -0.6073      14.71

-1.3578         -23.545     -0.442]

EのSVD:

E.convertTo(E, CV_32F);
Mat W = (Mat_<float>(3, 3) << 0, -1, 0, 1, 0, 0, 0, 0, 1);
Mat Z = (Mat_<float>(3, 3) << 0, 1, 0, -1, 0, 0, 0, 0, 0);

SVD decomp = SVD(E);
Mat U = decomp.u;
Mat Lambda = decomp.w;
Mat Vt = decomp.vt;  

エピポーラ制約の新しい必須マトリックス:

Mat diag = (Mat_<float>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 0);
Mat new_E = U*diag*Vt;

SVD new_decomp = SVD(new_E);

Mat new_U = new_decomp.u;
Mat new_Lambda = new_decomp.w;
Mat new_Vt = new_decomp.vt;

SVD からの回転:

Mat R1 = new_U*W*new_Vt;
Mat R2 = new_U*W.t()*new_Vt;

SVD からの翻訳:

Mat T1 = (Mat_<float>(3, 1) << new_U.at<float>(0, 2), new_U.at<float>(1, 2), new_U.at<float>(2, 2));
Mat T2 = -1 * T1;

私はR行列を次のように取得していました:

R1:

[ -0.58      -0.042     0.813
-0.020       -0.9975    -0.066
 0.81        -0.054     0.578]

R2:

[  0.98     0.0002      0.81
  -0.02      -0.99      -0.066
  0.81      -0.054      0.57 ]

翻訳マトリックス:

T1:

[0.543

-0.030

0.838]

T2:

[-0.543

0.03

-0.83]

どこが間違っているのか明確にしてください。

この P1=[I] の P2 行列 R|T の 4 つのセットは、正しくない三角測量モデルを提供しています。

また、得られた T 行列は、x シフトのみで z シフトはないと想定されていたため、正しくないと思います。

同じ image1=image2 で試してみると、T=[0,0,1] が得られました。Tz=1 とはどういう意味ですか? (両方の画像が同じであるため、z シフトはありません)

また、キーポイントの座標を画像の中心に合わせる必要がありますか、それともキャリブレーションから得られた主な焦点に合わせる必要がありますか?

4

0 に答える 0