我正在使用基于 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 分解对相机中心尺度敏感吗?