三角化相关总结

目录

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、线性三角化法

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

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

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

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

 展开得:

 

        在有噪声的情况下(没噪声就没什么好讲的了)求解的方法和我们在多视图几何总结——基础矩阵、本质矩阵和单应矩阵的求解过程吗?介绍的方法一致了,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<float>(3);
}

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

1.1 齐次方法

     

1.2 非齐次方法 

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

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

2、几何法 

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

在这里插入图片描述

 其解法也有如下两种:

 2.1 非线性优化法

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

2.2 最优解法

        如下图所示:

 在这里插入图片描述        我们可以将点到点的距离转化为点到直线的距离:

 具体步骤如下:

 

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

 3、误差分析

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

在这里插入图片描述

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

4、补充:深度滤波器

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

 因此有:

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

所以有:

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

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

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


 

 参考博客:

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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delaunay三角算法是一种用于将给定的点集进行三角划分的方法。它的目标是使得生成的三角形的外接圆不包含任何其他点。 具体实现Delaunay三角算法的方法可以是Bowyer-Watson算法。该算法的起始思想是先生成一个超级三角形,该超级三角形包含了整个地图中的所有点。然后,通过逐步添加地图中的点,并不断调整现有的三角形,最终得到一个满足Delaunay条件的三角划分。 具体步骤如下: 1. 首先,生成一个包含所有地图点的超级三角形。 2. 将随机点集中的第一个点添加到超级三角形中。 3. 对于随机点集中的每个点,按照以下步骤进行处理: a. 找到当前点所在的三角形。 b. 检查该三角形的外接圆是否包含其他任何点。如果包含,则需要调整该三角形。 c. 将该点与三角形的三个顶点连接,形成新的三个三角形。 d. 对于每个新形成的三角形,检查其外接圆是否包含其他任何点。如果包含,则需要调整该三角形。 4. 当所有的点都被处理完毕后,删除超级三角形和任何与超级三角相关三角形。 总结起来,Delaunay三角算法的实现策略是通过逐步添加地图中的点,并根据Delaunay条件对现有的三角形进行调整,最终得到一个满足条件的三角划分。 参考文献: Delaunay 三角,访问链接:https://zh.wikipedia.org/wiki/Delaunay%E4%B8%89%E8%A7%92%E5%8C%96 Delaunay 三角 -- 实现策略,Bowyer-Watson算法,见引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值