三角化相关总结

目录

1、线性三角化法

1.1 齐次方法

1.2 非齐次方法 

2、几何法 

 2.1 非线性优化法

2.2 最优解法

 3、误差分析

4、补充:深度滤波器


        本文转自大佬博客https://blog.csdn.net/weixin_44580210/article/details/90679847《多视图几何总结——三角形法》。

        在《视觉SLAM14讲》中,三角测量那一节简单介绍了如何通过两帧中匹配的点获得空间点深度,这对单目相机的成像是非常重要的,其证明如下,设x_{1}x_{2}分别为两帧中匹配好的特征点的归一化坐标,然后满足:

我们已经知道变换矩阵Rt,然后上面方程左乘一个x_{1}^{t}就可以求得s_{2},如下:

 很简单的,文中也提到由于存在噪声,上式不一定为零,需要用最小二乘法进一步求解,怎么求呢?如下:

1、线性三角化法

        在多视图几何中对问题的描述稍稍有点不一样,文中采用摄像机矩阵描述问题,摄像机矩阵指的是内参和外参合成的矩阵

 对于图像中的点通过摄像机矩阵应该满足:

 而实际上应为噪声的存在,他们并不满足基本的对极几何约束,如下图所示:

三角化相关总结_第1张图片

         我们通过叉乘构造基本方程,对第一幅图像有:

 展开得:

三角化相关总结_第2张图片

 

三角化相关总结_第3张图片

        在有噪声的情况下(没噪声就没什么好讲的了)求解的方法和我们在多视图几何总结——基础矩阵、本质矩阵和单应矩阵的求解过程吗?介绍的方法一致了,ORB SLAM2里面三角化的过程如下:

void Initializer::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(3);
}

方法和代码是对应一致的。

1.1 齐次方法

     

1.2 非齐次方法 

        和上面不同的是,如果将四维向量的约束条件设为最后一个齐次值为1的话,可以将上述方程构造成A X = b的非齐次方程,那这个求解的方法就是最小二乘法了,没什么好说的。

        上面两种解法中,第一种方法是更好的,结论和求解单应矩阵是相同的,因为第二种方法最后一维实际很接近零的话(点在无穷远处),那么求解的结果就会出现问题

2、几何法 

        这里介绍的所谓几何法其实类似于重投影误差,如下图所示:

三角化相关总结_第4张图片

 其解法也有如下两种:

 2.1 非线性优化法

        诸如高斯牛顿法、列温伯格法之列的,常规的非线性优化操作,不在此赘述。

2.2 最优解法

        如下图所示:

 三角化相关总结_第5张图片        我们可以将点到点的距离转化为点到直线的距离:

 具体步骤如下:

 三角化相关总结_第6张图片

其中,第二步的操作如下: 

 3、误差分析

         线性三角形法和几何法比较的话,几何法获得误差会相对更小,但是在ORB SLAM2里面作者是直接三用线性三角法的,几何法的计算量摆在这儿呢,另外,如下图所示:

三角化相关总结_第7张图片

        纯旋转情况下是无法进行三角化的(因为不满足对极约束的要求),平移量越大误差会越小,但是平移量过大的话,物体匹配会变困难,这个叫三角测量矛盾。

4、补充:深度滤波器

        和三角形法相关的一个比较有意思的东西叫深度滤波器,SVO的深度估计就是通过深度滤波器实现的,《视觉SLAM十四讲》中也有总结,这里也顺带总结一下:

        深度滤波器使用的背景是,在单目中如果想实现稠密或者半稠密的SLAM的话如果对每个点都进行三角法估计深度的话是不现实的,因为不可能对图像中每个点都进行匹配,于是就诞生了基于极线搜索和块匹配技术深度滤波器,如下图: 

三角化相关总结_第8张图片

解释起来很简单,就是当p_{1},p_{2}就成了一个极线段而不是一个点,我们在p_{1}p_{2},周围取一些像素小块进行匹配,这就是极线搜索和块匹配技术,块匹配的话一般是拿灰度值(SAD、SSD、NCC等,具体的可以查书,反正就是相似性的一种计算)进行匹配的,匹配完成后就可以进行深度滤波,这里假设p_{1}的深度d是满足高斯分布的:

这里的滤波就是通过高斯相乘,即

规则知道了,那么现在的问题是我们匹配好的像素块的深度分布怎么计算呢?均值\mu_{obs}就是像素块中心确定的深度方差\sigma _{obs}计算方法是计算相差一个像素距离的变化值,如下

三角化相关总结_第9张图片

这里的求解就是高中数学知识了,上图中这几个变量的关系是:

三角化相关总结_第10张图片

 对p_{2}进行一个像素的扰动有:

 因此有:

由正弦定理可以求得p’的大小有

所以有:

 上面过程通顺之后,我们就不断进行迭代,最后直到深度收敛即可,总结步骤如下

  1. 假设所有像素的深度满足某个初始的高斯分布;
  2. 当新数据产生时,通过极线搜索和块匹配确定投影点位置;
  3. 根据几何关系计算三角化后的深度以及不确定性;
  4. 将当前观测融合进上一次的估计中。若收敛则停止计算,否则返回 2

        这里注意的是,稠密SLAM的话还是要对每一个像素值都进行深度滤波的,只是说通过深度滤波不需要对每个像素进行匹配,其计算量还是很大的。


 

 参考博客:

https://blog.csdn.net/weixin_44580210/article/details/90679847

你可能感兴趣的:(SLAM面试)