目录

介绍

单目稠密建图

极线搜索与块匹配

块匹配

深度滤波器

常见问题与改进


介绍

之所以只讲单目稠密建图,这是因为,首先,对于RGBD图,我们已知所有点的深度,可以直接生成稠密的点云。其次,对于稀疏地图,其实很多VO中已经完成了稀疏地图的构建,但是稀疏地图只能用于定位,不能用于导航避障之类的工作。所以很多slam系统中会额外进行稠密地图、甚至语义地图的构建。

单目稠密建图

通常在单目VO中,我们通过特征点匹配三角测量可以获得稀疏地图点的深度,现在我们想要建立稠密的地图,这意味着我们需要获得图片中所有像素点的深度。那么首先我们需要做的一点就是确定第一幅图的某个像素出现在其他图中的位置。此时我们当然可以遍历所有的像素点,然后计算所有像素点的描述子,然后在另一幅图片中寻找与其匹配的点。但是,这种方法先不说效果如何,光想想每一幅图像我们需要计算与匹配的特征描述子数量就够吓人的了。所以这种方法应该是不可取的。

针对这个问题,一种比较有效的方法是使用极线搜索块匹配技术。

极线搜索与块匹配

首先,在slam中建图,我们是可以使用前端的测量结果的,所以我们知道每一帧的相机位姿,也就是相机的外参,根据相机的外参与内参,我们可以将基准帧上的一点(我们也称该点为种子)投影到当前帧的一条射线上,这条线也叫做极线(具体原理可以参考对极几何)。所以我们想找的点就在这条极线上,而在极线上确定这个点的过程就叫做极线搜索

只要知道了两帧之间的相对位姿就可以确定极线,不过如果还知道点的初始深度,此时还可以缩小找匹配时的搜索量。

确定极线的方法有很多,我们在这里介绍一种svosvo中确定极线的方法:

  1. 在种子深度延长线上,构造两个三维点,这两个三维点来源自同一个像素,只是确定它们的深度不同。在深度滤波器中一般是设置为,其中是种子的初始深度是深度的方差,可以调节成不同的值,比如等,一般取3

  2. 利用帧间位姿,投影到当前帧,投影点为,连接就是我们所要的极线(此处是一个线段)

块匹配

其实极线搜索我们一般都是采用了块匹配的方式。所谓的块匹配就是说对于极线上的一个点,我们判断它与参考点的相关性,是通过在点周围取一个的小块,然后在基线上也取很多同样大小的小块进行比较。比较的方法有很多,主要是衡量两个小块的相似性。

此处,我们假设对于一个像素点,我们将其周围的小块记成,把极线上的每个点的小块记为。那么,下列方法都可以用来计算小块之间的差异。

  • SAD(Sum of Absolute Difference)。取两个小块的差的绝对值之和(这个结果越大,说明越不匹配,越接近0,块的相似度越高):

  • SSD(Sum of Squared Distance)。即取两个小块的差的平方和(这个结果越大,说明越不匹配,越接近0,块的相似度越高):

  • NCC(Normalized Cross Correlation)。即计算两个小块的归一化互相关(这个结果越大,说明相似度越高,0时代表完全不相关):

上述三种方法是比较常见的三种方法,现实中我们使用的方法可能要更复杂一点,比如在中使用的是的矩形计算相似性,与此同时,通常我们在计算小块的差异之前,还需要做一些预处理操作,比如去均值(减小亮度影响)、根据参考帧当前帧间的运动首先将块进行对应的仿射变换再进行匹配等。

深度滤波器

在使用极线搜索与块匹配确定了匹配的像素之后,使用三角测量便可以确定出该点的深度。但是我们知道,测量出来的像素也许是有噪声的,所以单次测量出来的深度其实是一个不确定值,我们可以假设它服从一种概率分布(lsd中假设为高斯分布),通过对于多帧不断的进行上述操作,我们可以尝试对测量出来的深度进行优化。这样,如何估计每个像素点的深度就变成了一个状态估计的问题,此时会存在滤波器与非线性优化两种求解的思路。

我们当然可以直接构造非线性最小二乘,然后使用非线性优化的方法进行求解,但是要知道我们是对整幅图像的所有像素进行深度估计,这样做计算量会很大,因此很多稠密建图的工作都是使用滤波器的方法更新深度,其中使用的是卡尔曼滤波器提出了一种深度滤波器的方法。有时间会详细介绍这种方法。

常见问题与改进

  • 使用块匹配的方法很依赖图像环境,比如梯度明显的小块可能比较好区分,梯度不明显的像素容易引起误匹配。

  • 在深度滤波器中假设深度满足高斯分布其实是不合理的,因为深度通常不像是高斯分布是一个对称的分布,而是一边短(因为深度不会小于相机焦距,近似0),一边长(深度可以是很深甚至无穷远),所以我们可以采用逆深度的概念,即假设深度的倒数(即将改为)(视差)为高斯分布,这样会得到更好的结果。

  • 假设相机发生了旋转,那么块的相似性很难保持(比如上黑下白的图像库旋转会变成上白下黑),所以我们需要计算仿射矩阵(通过三点法确定),通过仿射矩阵将基准帧中的块里的像素坐标逐一映射到当前帧中,这样映射的所有坐标就组成了块

  • 由上面的介绍,我们会发现对每个像素的深度估计的过程都是相同但是独立的,因此我们可以并行的处理他们。GPU编程会比较适合。

  • 使用统计滤波器去除孤立点。(统计每个点与它最近的N个点的距离值分布,去除距离均值过大的点)

  • 使用体素滤波器去除重叠点。因为我们重建是基于很多图片,不可避免一个点可能在好多图片都观察到了,此时体素滤波器保证在某一个一定大小的立方体(也叫体素)内仅有一个点,相当于对三维空间进行了降采样,从而节省存储空间。体素滤波器可以根据不同的需求设置不同的分辨率

参考: 视觉SLAM十四讲

SLAM_视觉SLAM中的一种单目稠密建图方法相关推荐

  1. 视觉slam中的一种单目稠密建图方法

    之所以只讲单目的稠密建图,这是因为,首先,对于RGBD图,我们已知所有点的深度,可以直接生成稠密的点云.其次,对于稀疏地图,其实很多VO中已经完成了稀疏地图的构建,但是稀疏地图只能用于定位,不能用于导 ...

  2. 视觉SLAM笔记(61) 单目稠密建图

    视觉SLAM笔记(61) 单目稠密建图 1. 立体视觉 2. 极线搜索与块匹配 3. 高斯分布的深度滤波器 1. 立体视觉 相机,很久以来被认为是只有角度的传感器(Bearing only) 单个图像 ...

  3. orb特征 稠密特征_一种基于ORB-SLAM2的双目三维稠密建图方法技术

    本发明专利技术公开了一种基于ORB‑SLAM2的双目稠密建图方法,涉及机器人同步定位与地图创建领域,该方法主要由跟踪线程.局部地图线程.闭环检测线程和稠密建图线程组成.其中稠密建图线程包含以下步骤:1 ...

  4. 视觉SLAM中,本质矩阵、基础矩阵、单应性矩阵自由度和秩分析

    视觉SLAM中,本质矩阵.基础矩阵.单应性矩阵自由度和秩分析 1.各个矩阵的自由度 由于基础矩阵和本质矩阵都是由对极约束来的 1.1 本质矩阵E的自由度为5,秩为2 1.1.1 自由度: 首先,旋转和 ...

  5. 大盘点!自动驾驶中基于Transformer的单目BEV感知

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 今天自动驾驶之心很荣幸邀请到Garfield,为大家分享自动驾驶中基于Transformer的单目BEV感知! ...

  6. 视觉SLAM笔记(63) RGB-D 稠密建图

    视觉SLAM笔记(63) RGB-D 稠密建图 1. 建立点云地图 2. 点云地图 3. 其他重建方法 1. 建立点云地图 所谓点云,就是由一组离散的点表示的地图 最基本的点包含 x, y, z 三维 ...

  7. SLAM第十二讲实践:【建图】单目稠密图重建实践、RGB_D稠密建图、 从RGB_D稠密建图点云重建网格图、八叉树地图实践

    2022.10.20 bionic 目录 1 单目稠密图重建实践 1.1 修改CMakeLists.txt 1.2 实现 2 RGB_D稠密建图 2.1 c_cpp_properties.json 2 ...

  8. 指标异动排查中,3种快速定位异常维度的方法

    如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享, 欢迎移步公众号「小火龙说数据」,更多精彩原创文章与你分享! 「经验」指标异动排查中,3种快速定位异常维度的方法https://mp.w ...

  9. LIOM: 一种新的激光惯性里程计和建图方法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L | 来源:知乎 https://zhuanlan.zhihu.com/p/137 ...

  10. SVO: 视觉SLAM中特征点法与直接法结合

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前面的话 VSLAM 是利用多视图几何理论,根据相机拍摄的图像信息 ...

最新文章

  1. 动手实验2-ODCH(11)
  2. 天地图专题三:根据标注点的范围确定天地图的中心点和缩放级别
  3. python在函数内部有没有办法定义全局变量_修改函数内部的全局变量
  4. boost::mp11::mp_max_element_q相关用法的测试程序
  5. Java 操作 HDFS
  6. Linux下 查找大文件
  7. Eclipse发布Web项目
  8. 问题六十四:怎么用C++实现二叉查找树(binary search tree)及其相关操作
  9. Linux宝库快讯 | OpenStack中国日更名OpenInfra中国日
  10. Java微信公众平台开发(十一)——开发中微信公众平台/开放平台/商户平台的关联
  11. 水平面:篡命铜钱の1
  12. 小米平板4刷recovery教程_小米平板4解锁刷入魔趣详细教程 米板4怎么解锁刷机
  13. 前端开发工具WebStorm下载
  14. Dubbo之服务导入流程解析
  15. [运算放大器]佛朗哥笔记 - 电阻性反馈电路 - 差分放大器与仪表放大器
  16. C语言:extern用法
  17. Pytorch 学习率衰减方法
  18. 简单了解APP黑暗模式
  19. qqhelp.net 删除 查杀 清除QQ病毒qqhelp变种(6440'qqhelp'net/#sqq5)的方法
  20. 三菱FX系列 DADD和DSUB指令使用

热门文章

  1. .net core 介绍好文章
  2. 电脑硬盘坏道怎么检测,又如何修复图文教程
  3. FileOprSer.class.php(文件上传与下载类)
  4. Python中常见的字符串小笔试题
  5. Vertex Shader-顶点着色入门
  6. C# .NET开发图形图像程序时提示“GDI+ 中发生一般性错误“
  7. 理解Java - JDK动态代理原理
  8. VC预定义常量WIN32、_WIN32、_WIN64分析(转载)
  9. 05. 区间成员函数优先于与之对应的单元素成员函数
  10. DBCP与C3P0连接池组件