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 シフトはありません)
また、キーポイントの座標を画像の中心に合わせる必要がありますか、それともキャリブレーションから得られた主な焦点に合わせる必要がありますか?