SLAM三角测量程序理解【随笔更】

函数 triangulation


void triangulation ( 
    const vector< KeyPoint >& keypoint_1, 
    const vector< KeyPoint >& keypoint_2, 
    const std::vector< DMatch >& matches,
    const Mat& R, const Mat& t, 
    vector< Point3d >& points )
{
    Mat T1 = (Mat_ (3,4) <<
        1,0,0,0,
        0,1,0,0,
        0,0,1,0);
    Mat T2 = (Mat_ (3,4) <<
        R.at(0,0), R.at(0,1), R.at(0,2), t.at(0,0),
        R.at(1,0), R.at(1,1), R.at(1,2), t.at(1,0),
        R.at(2,0), R.at(2,1), R.at(2,2), t.at(2,0)
    );
    
    Mat K = ( Mat_ ( 3,3 ) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1 );
    vector pts_1, pts_2;
    for ( DMatch m:matches )
    {
        // 将像素坐标转换至相机坐标
        pts_1.push_back ( pixel2cam( keypoint_1[m.queryIdx].pt, K) );
        pts_2.push_back ( pixel2cam( keypoint_2[m.trainIdx].pt, K) );
    }
    
    Mat pts_4d;
    cv::triangulatePoints( T1, T2, pts_1, pts_2, pts_4d );
    
    // 转换成非齐次坐标
    for ( int i=0; i(3,0); // 归一化
        Point3d p (
            x.at(0,0), 
            x.at(1,0), 
            x.at(2,0) 
        );
        points.push_back( p );
    }
}

1.1

SLAM三角测量程序理解【随笔更】_第1张图片
T1标定为原点,T2变成R T 结合的变换坐标,K为相机内参

1.2 像素坐标(2维)转化为相机坐标(3维)

SLAM三角测量程序理解【随笔更】_第2张图片

用到了下面内部函数
SLAM三角测量程序理解【随笔更】_第3张图片
转化方法如下图
SLAM三角测量程序理解【随笔更】_第4张图片
u v :像素坐标元素
X Y Z : 相机坐标元素
通过图片式 5.5 写出的函数 Point2f pixel2cam ( const Point2d& p, const Mat& K )

1.3 triangulatePoints 输出3D坐标

    Mat pts_4d;
    cv::triangulatePoints( T1, T2, pts_1, pts_2, pts_4d );

    // 转换成非齐次坐标
    for ( int i=0; i(3,0); // 归一化
        Point3d p (
            x.at(0,0), 
            x.at(1,0), 
            x.at(2,0) 
        );
        points.push_back( p );
    }

SLAM三角测量程序理解【随笔更】_第5张图片
参考链接
https://www.jianshu.com/p/96d3b832330e
课本
视觉SLAM14讲

你可能感兴趣的:(OpenCV库,SLAM基础)