OpenCV ライブラリに基づく 2d-3d アルゴを使用して VSLAM タスクを解決しています。現在、GPS データを使用してジオリファレンスを作成しようとしています。各カメラの R, t を変換し、自明な関数を使用して一致した点を三角測量します
Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D) {
cv::Mat A(4,4,CV_32F);
A.row(0) = kp1.pt.x*P1.row(2)-P1.row(0);
A.row(1) = kp1.pt.y*P1.row(2)-P1.row(1);
A.row(2) = kp2.pt.x*P2.row(2)-P2.row(0);
A.row(3) = kp2.pt.y*P2.row(2)-P2.row(1);
cv::Mat u,w,vt;
cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV);
x3D = vt.row(3).t();
x3D = x3D.rowRange(0,3)/x3D.at<float>(3); }
ここで、kp1 と kp2 - 左右の画像のキーポイント、P1、P2 - 射影行列
私は奇妙な問題に直面しました:カメラの中心を大きな定数で単純にシフトすると、古い適切な三角点で大きな再投影エラーが発生します。ポイントの三角形分割の SVD 分解は、カメラの中心のスケールに敏感ですか?