ORB-SLAM2学习笔记——Triangulate三角化函数

1、 理论部分

看图然后能得到下式,用第三个与前两个结合求解:
u=λP0X
v=λP1X
1=λP2X
在这里插入图片描述

2、代码部分

//三角化
//将空间点投影到两个相机平面
void Initializer::Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D)
{
    //构造A矩阵,用于求解空间点 A*X = 0;
    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);
    //对A矩阵进行SVD分解,所得右矩阵的最后一列就是所需的解
    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();
    //保持解的齐次形式,让最后一个为1;
    x3D = x3D.rowRange(0,3)/x3D.at<float>(3);
}