之所以只讲单目稠密建图,这是因为,首先,对于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中的一种单目稠密建图方法相关推荐

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

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

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

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

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

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

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

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

  5. 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 ...

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

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

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

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

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

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

  9. PSL‑SLAM:PSL‑SLAM: a monocular SLAM system using points and structure lines in Manh 曼哈顿世界中的点线单目SLAM

    文章下载地址:https://download.csdn.net/download/weixin_50508111/85811572 一.文章简介 1. 文章类型/时间/作者/所属单位: 期刊论文/2 ...

最新文章

  1. 娓娓道来!那些BERT模型压缩方法
  2. 堆和栈组合:双端队列c++
  3. websphere 内存溢出处理
  4. 纯C++版的Faster-Rcnn(通过caffe自定义RPN层实现)
  5. RPC调用框架比较分析
  6. Java文件类String [] list(FilenameFilter fnf)方法,带示例
  7. FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
  8. EditText焦点自动带出软键盘问题
  9. 《『若水新闻』客户端开发教程》——08.设计新闻回复UI
  10. CreateThread函数--创建线程
  11. 网页加载java慢_为什么开网页很慢 网页打开速度慢的原因【解决方法】
  12. 操作系统、计算机网络、数据库系统概论等相关面试问题
  13. kernel exploit 有用的结构体
  14. Java —— 冒泡排序
  15. Homekit智能家居DIY之智能灯泡
  16. 【心电检测】基于 EMD、CEEMDAN 算法实现呼吸心跳信号检测实例(去除呼吸旁瓣干扰,测量心跳频率)附matlab代码
  17. 谷歌旗下专业图片编辑Snapseed获重大更新
  18. 数字电路11-异步计数器
  19. [洛谷] P1168 中位数
  20. jQuery 选择器(checked)详解

热门文章

  1. Android关于网络访问app应用开发相关的异常总结
  2. Appium连接逍遥模拟器,解决Timing Out
  3. 服务网格——后 Kubernetes 时代的微服务(前言)
  4. 天呐!350道Java面试真题分享
  5. 录屏可以录声音吗?录制带声音的视频,这个方法轻松解决
  6. java微信开发平台_Java微信公众平台开发(1) 接入微信公众平台
  7. 从前端技术到体验科技(附演讲视频)
  8. win10系统还原失败错误0x80070091的解决方法
  9. 电脑进入bios快捷键是什么|开机按哪个键进BIOS设置
  10. Android 获取通话记录和短信内容