首页 > 其他 > 详细

三角化地图点

时间:2021-03-14 23:51:25      阅读:64      评论:0      收藏:0      [点我收藏+]

视觉slam中,地图点大部分都是通过三角化给出初值,再利用最小化重投影误差进行优化细化; 其三角化过程先打给粗糙记录下:

技术分享图片

void triangulate ( const Eigen::Matrix3d& K, 
                   const Eigen::Matrix4d T1, const Eigen::Matrix4d& T2, 
                   const Eigen::Vector2d& uu1, const Eigen::Vector2d& uu2, 
                   Eigen::Vector4d& X )
{
    // construct P1 P2
    const Eigen::Matrix<double, 3, 4> P1 = K * T1.block(0,0, 3, 4);
    const Eigen::Matrix<double, 3, 4> P2 = K * T2.block(0, 0, 3, 4);
    
    // get vectors
    const Eigen::Matrix<double, 1, 4>& P11 = P1.block(0, 0, 1, 4);
    const Eigen::Matrix<double, 1, 4>& P12 = P1.block(1, 0, 1, 4);
    const Eigen::Matrix<double, 1, 4>& P13 = P1.block(2, 0, 1, 4);
    
    const Eigen::Matrix<double, 1, 4>& P21 = P2.block(0, 0, 1, 4);
    const Eigen::Matrix<double, 1, 4>& P22 = P2.block(1, 0, 1, 4);
    const Eigen::Matrix<double, 1, 4>& P23 = P2.block(2, 0, 1, 4);
    
    const double& u1 = uu1[0];
    const double& v1 = uu1[1];
    const double& u2 = uu2[0];
    const double& v2 = uu2[1];
    
    // construct H matrix.
    Eigen::Matrix4d H;
    H.block(0, 0, 1, 4) = v1 * P13 - P12;
    H.block(1, 0, 1, 4) = P11 - u1 * P13;
    H.block(2, 0, 1, 4) = v2 * P23 - P22;
    H.block(3, 0, 1, 4) = P21 - u2 * P23;
    
    // SVD
    Eigen::JacobiSVD<Eigen::MatrixXd> svd ( H, Eigen::ComputeFullU | Eigen::ComputeFullV );
    Eigen::Matrix4d V = svd.matrixV();
    
    X = V.block(0, 3, 4, 1);
    X = X / X(3, 0);
} // triangulate

 

三角化地图点

原文:https://www.cnblogs.com/morningsunlll/p/14534543.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!