转载请注明原创地址:https://blog.csdn.net/qq_30356613/article/category/6897125

ORBSLAM中对于特征点的匹配在不同情况下有不同的匹配方式。分为以下几种:

1. 按照投影进行匹配

2. 按照bow向量节点进行匹配

3. 针对初始化地图点的匹配

4. 针对单目三角化的匹配

5. 基于相似矩阵的匹配

6. 通过匹配来提出冗余地图点

一、首先看按照投影进行的匹配

按照投影方式的不同将其分为上一帧投影到当前帧(tracking线程的按照运动模型进行位姿估计),关键帧投影到当前帧(tracking线程的重定位),地图点投影到当前帧(tracking线程的局部地图追踪进行位姿估计),地图点通过相似矩阵投影到关键帧(回环检测线程中)

1、地图点投影到当前帧的方式匹配(tracking线程的局部地图追踪进行位姿估计)

总体思路是遍历所有地图点,分别向当前帧进行投影,在当前帧中找到一个描述子距离最相近的特征点作为其匹配点。

首先根据地图点在金字塔中的层数确定该地图点在当前帧的搜索半径,然后以该地图点在当前帧的投影(在tracking线程中调用Frame::isInFrustum(MapPoint *pMP, float viewingCosLimit)来确定地图点在当前帧的投影像素坐标)为中心进一步确定地图点在当前帧的投影区域。得到当前帧在投影位置搜索半径内的所有特征点。分别计算这些特征点描述子与当前地图点最优描述子的距离,找到最小距离对应的特征点,作为当前地图点在该帧中的匹配。匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。(2)这里的匹配还计算了第二最优匹配点(描述子距离第二小),目的是计算第一匹配点/第二匹配点的比率(小于1),当比率大时说明第二匹配点和第一匹配点相当,第一匹配点描述子没有特别的“优越性”,在这种情况下不妨舍弃这对匹配,防止发生误匹配。将得到的匹配地图点添加进当前帧的地图点容器中,索引坐标为该地图点对应的特征点在当前帧的特征索引。

2、上一帧投影到当前帧的匹配方式(tracking线程的按照运动模型进行位姿估计)

总体思路是遍历上一帧中所有地图点,分别向当前帧进行投影,在当前帧中找到一个描述子距离最相近的特征点作为其匹配点。

首先根据上一帧地图点在上一帧图像金字塔中的层数确定该地图点在当前帧图像金字塔中的层数,根据金字塔层数确定搜索半径,然后将该地图点的世界坐标系下的坐标根据相机内参数矩阵和旋转平移矩阵(注意这里的旋转平移矩阵是根据上一帧的旋转平移矩阵和上一帧的位姿变化速度推算的当前帧的初始位姿)投影到当前帧,得到上一帧地图点在当前帧的像素坐标(判断投影后的像素坐标的有效性),以投影结果为中心以金字塔层数确定的搜索半径为半径作为搜索区域,从而得到当前帧在投影区域内的所有特征点。分别计算这些特征点描述子与上一帧待追踪地图点的最优描述子距离,找到最小距离对应的特征点,作为上一帧待追踪地图点在该帧中的匹配点。最后进行匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。(2)这里的匹配还计算了第二最优匹配点(描述子距离第二小),目的是计算第一匹配点/第二匹配点的比率(小于1),当比率大时说明第二匹配点和第一匹配点相当,第一匹配点描述子没有特别的“优越性”,在这种情况下不妨舍弃这对匹配,防止发生误匹配。(3)如果需要判别匹配点的方向则通过梯度方向直方图进行筛选。将得到的匹配地图点添加进当前帧的地图点容器中,索引坐标为该地图点对应的特征点在当前帧的特征索引。

3、关键帧投影投影到当前帧的匹配方式(tracking线程的重定位)

总体思路是遍历关键帧中所有地图点,分别向当前帧进行投影,在当前帧中找到一个描述子距离最相近的特征点作为其匹配点。

首先根据当前帧的初始位姿(在重定位过程中PNP方式来计算位姿作为当前帧的初始位姿)和相机内参数矩阵,将关键帧的地图点映射到当前帧,从而得到关键帧的地图点在当前帧的映射像素坐标,将映射的像素坐标作为中心,然后根据地图点到光心的距离推算该特征点对应的高斯金字塔层数,从而确定搜索半径并确定关键帧地图点在当前帧匹配的搜索区域,从而得到当前帧在投影区域内的所有特征点。分别计算这些特征点描述子与上一帧待追踪地图点的最优描述子距离,找到最小距离对应的特征点,作为上一帧待追踪地图点在该帧中的匹配点。最后进行匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。(2)这里的匹配还计算了第二最优匹配点(描述子距离第二小),目的是计算第一匹配点/第二匹配点的比率(小于1),当比率大时说明第二匹配点和第一匹配点相当,第一匹配点描述子没有特别的“优越性”,在这种情况下不妨舍弃这对匹配,防止发生误匹配。(3)如果需要判别匹配点的方向则通过梯度方向直方图进行筛选。将得到的匹配地图点添加进当前帧的地图点容器中,索引坐标为该地图点对应的特征点在当前帧的特征索引。

4、地图点通过相似矩阵投影到关键帧(回环检测线程中计算得到相似矩阵之后匹配当前检测关键帧(回环末端)和回环关键帧(回环始帧)的局部地图点进行匹配)

总体思路是遍历回环关键帧的所有共视图地图点,将这些地图点利用求得的sim矩阵投影到当前检测关键帧下,在当前关键帧中找到一个描述子距离最相近的特征点作为其匹配点。

首先根据当前帧的相似变换矩阵(在回环检测过程中通过sim求解器求解)和相机内参数矩阵,将回环关键帧的共视地图点映射到当前检测关键帧,从而得到共视地图点在当前待检测回环关键帧的映射像素坐标,将映射的像素坐标作为中心,然后根据地图点到光心的距离推算该特征点对应的高斯金字塔层数,从而确定搜索半径并确定关键帧地图点在当前帧匹配的搜索区域,从而得到当前帧在投影区域内的所有特征点。分别计算这些特征点描述子与上一帧待追踪地图点的最优描述子距离,找到最小距离对应的特征点,作为上一帧待追踪地图点在该帧中的匹配点。最后进行匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。

二、按照bow向量节点进行匹配

按照BOW向量节点进行匹配有一个明显的优势是在此之前不需要知道任何关于两个匹配对象的几何关系,在第一节中讲到的按照投影的方式进行的匹配,都是给定两匹配对象的初步几何关系,然后根据初步的几何关系确定一个投影区域(投影中心和投影半径),在投影区域内寻找匹配。而相对于投影的匹配方式,按照BOW节点向量进行搜索匹配就不需要预先的集合关系了,按照BOW向量进行的匹配直接根据之前维护的词袋模型,在所有相同bow节点下的特征点中进行搜索匹配,同样更快速。这种方式往往在无法给定两匹配对象之间的初步几何关系时使用。根据匹配对象不同又分为:(1)关键帧和当前帧通过词袋进行快速匹配(1.用在tracking线程根据参考关键帧进行线程追踪过程中2.重定位)(2)关键帧和当前帧通过词袋进行快速匹配(回环检测)

具体如下:

1、关键帧和当前帧通过词袋进行快速匹配(1.用在tracking线程根据参考关键帧进行线程追踪过程中2.重定位)

总体思路是遍历关键帧中所有特征向量和当前帧中的所有特征向量,计算在同一BOW节点下两特征向量的距离,找到一对描述子距离最相近的特征点作为匹配点。

首先取出关键帧和当前帧的特征向量(注意这里的特征向量是根据节点id排序好的特征向量(用DBOW库中的特征向量),便于我们进行搜索),然后遍历关键帧的每一个特征向量,在当前帧的同一节点下搜索其匹配点(计算同一节点特征向量对应描述子的距离最小匹配作为其匹配点)。最后进行匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。(2)这里的匹配还计算了第二最优匹配点(描述子距离第二小),目的是计算第一匹配点/第二匹配点的比率(小于1),当比率大时说明第二匹配点和第一匹配点相当,第一匹配点描述子没有特别的“优越性”,在这种情况下不妨舍弃这对匹配,防止发生误匹配。(3)如果需要判别匹配点的方向则通过梯度方向直方图进行筛选。将得到的匹配地图点添加进匹配地图点容器中,索引坐标为该地图点对应的特征点在当前帧的特征索引。

2、关键帧和关键帧帧通过词袋进行快速匹配(回环检测)

总体思路是遍历关键帧1中所有特征向量和关键帧2中的所有特征向量,计算在同一BOW节点下两特征向量的距离,找到一对描述子距离最相近的特征点作为匹配点。

首先取出关键帧1和关键帧2的特征向量(注意这里的特征向量是根据节点id排序好的特征向量(用DBOW库中的特征向量),便于我们进行搜索),然后遍历关键帧1的每一个特征向量,在关键帧2的同一节点下搜索其匹配点(计算同一节点特征向量对应描述子的距离最小匹配作为其匹配点)。最后进行匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。(2)这里的匹配还计算了第二最优匹配点(描述子距离第二小),目的是计算第一匹配点/第二匹配点的比率(小于1),当比率大时说明第二匹配点和第一匹配点相当,第一匹配点描述子没有特别的“优越性”,在这种情况下不妨舍弃这对匹配,防止发生误匹配。(3)如果需要判别匹配点的方向则通过梯度方向直方图进行筛选。将得到的匹配地图点添加进匹配地图点容器中,索引坐标为该地图点对应的特征点在当前帧的特征索引。

三、针对单目初始化的匹配(单目初始化中)

总体思路是针对单目初始化的匹配,由于在单目初始化之前并没有深度信息即还没有计算地图点,因此不能和一般的匹配一样通过遍历地图点进行匹配,只能通过遍历图像的特征点。

首先取帧1中的所有特征点,根据给定参数搜索窗口确定搜索半径,根据该特征点在帧1中的2D位置估计其在帧2中的搜索中心,从而根据搜索中心和半径确定搜索范围,在帧2中搜索当前特征点的匹配点。最后进行匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。(2)这里的匹配还计算了第二最优匹配点(描述子距离第二小),目的是计算第一匹配点/第二匹配点的比率(小于1),当比率大时说明第二匹配点和第一匹配点相当,第一匹配点描述子没有特别的“优越性”,在这种情况下不妨舍弃这对匹配,防止发生误匹配。(3)如果需要判别匹配点的方向则通过梯度方向直方图进行筛选。将得到的匹配地图点添加进匹配地图点容器中,索引坐标为该地图点对应的特征点在当前帧的特征索引。

四、针对单目三角化的匹配(在localmapping线程中新建地图点时调用)

此匹配方式主要应用于localmapping线程中新建地图点,此次新建地图点是针对于tracking线程中没有匹配到的地图点。总体思路是针对单目的尺度不确定性,在计算地图点深度时进行的匹配,利用三角测量筛选匹配点的正确性。匹配的是当前处理的关键帧及其相邻关键帧。

首先循环所有关键帧1中的所有BOW节点,并在关键帧2中寻找与其具有相同BOW节点的特征点索引,循环关键帧2中找到的相同BOW节点下特征点索引,计算两关键帧中特征点的描述子距离,从而选择最小的描述子距离的一对特征点作为一对匹配点。注意这里在确定匹配之前需要进行对极约束(关键帧2中的匹配点距离根据关键帧1计算得到的极线的距离来判断匹配点是否满足对极几何)。最后进行匹配筛选(剔除误匹配):(1)匹配描述子距离小于阈值。(2)如果需要判别匹配点的方向则通过梯度方向直方图进行筛选。将得到的匹配地图点添加进匹配地图点容器中,索引坐标为该地图点对应的特征点在当前帧的特征索引。

五、基于相似矩阵的匹配(用于回环检测计算相似矩阵之后)

获取关键帧1 2的相机位姿以及相机1->相机2的位姿变换相似矩阵

双向匹配:

根据相似矩阵将关键帧1中的地图点向关键帧2中投影,确定投影区域,并在投影区域内寻找关键帧1中地图点的匹配

根据相似矩阵将关键帧2中的地图点向关键帧1中投影,确定投影区域,并在投影区域内寻找关键帧2中地图点的匹配

根据双向匹配结果,如果两次匹配都能成功,则确定该对匹配是有效的.将其存入vpMatches12容器

最终返回匹配点对个数

六、通过匹配来提出冗余地图点

1、融合地图点匹配(用于局部建图线程的关键帧地图点及其相邻帧的融合)

将MapPoints投影到关键帧pKF中,并判断是否有重复的MapPoints

1> 如果MapPoint能匹配关键帧的特征点,并且该点有对应的MapPoint,那么将两个MapPoint合并(选择观测数多的)

2> 如果MapPoint能匹配关键帧的特征点,并且该点没有对应的MapPoint,那么为该点添加MapPoint

投影方式和剔除误匹配的方式与上述方式类似,不再赘述。

2、融合地图点(用于回环检查线程,根据相似矩阵融合当前关键帧和地图点融合)

根据相似矩阵Scw映射地图点到关键帧。

主要思路: 将回环地图点根据当前关键帧的位姿(相似矩阵)映射到当前关键帧,在当前关键帧中寻找回环地图点的代替点,存储进vpReplacePoint

投影方式和剔除误匹配的方式与上述方式类似,不再赘述。

一起学ORBSLAM2(6)ORBSLAM中的特征匹配相关推荐

  1. OpenCV中的特征匹配+单应性以查找对象

    OpenCV中的特征匹配+单应性以查找对象 1. 效果图 2. 源码 参考 这篇博客将混合calib3d模块中的特征匹配和单应性,在复杂图像中查找已知对象. 1. 效果图 特征匹配 & 单应性 ...

  2. OpenCV中的特征匹配(Feature Matching)

    OpenCV中的特征匹配(Feature Matching) 1. 效果图 2. 原理 3. 源码 3.1 SIFT关键点检测+Knn近邻匹配 3.2 ORB关键点检测+蛮力特征匹配 3.3 SIFT ...

  3. 图像特征算法(三)——ORB算法简述及Python中ORB特征匹配实践

    计算机视觉专栏传送 上一篇:图像特征算法(二)--SURF算法简述及Python标记SURF特征检测实践 下一篇:持续创作中- 目录 计算机视觉专栏传送 一.ORB算法 1.算法简介 2.FAST寻找 ...

  4. 【理解】ORB特征提取与ORBSLAM特征匹配简要剖析

    目录 ORB特征提取 优势: 经典FAST特征提取: 经典的BRIEF描述子: ORB特征提取的改进: 如何在FAST检测的基础上维持特征点的尺度不变性? 如何在FAST检测的基础上维持特征点的旋转不 ...

  5. ORB-SLAM中的ORB特征(提取)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:小葡萄 https://zhuanlan.zhihu.com/p/61738607 本文仅做学术 ...

  6. (三)ORB特征匹配

    ORBSLAM2匹配方法流程 在基于特征点的视觉SLAM系统中,特征匹配是数据关联最重要的方法.特征匹配为后端优化提供初值信息,也为前端提供较好的里程计信息,可见,若特征匹配出现问题,则整个视觉SLA ...

  7. 特征匹配 + 单应性查找对象

    在本章节中, - 我们将把calib3d模块中的特征匹配和findHomography混合在一起,以在复杂图像中找到已知对象. 上节中,我们使用了queryImage,找到了其中的一些特征点,我们使用 ...

  8. OpenCV2:特征匹配及其优化

     在OpenCV2简单的特征匹配中对使用OpenCV2进行特征匹配的步骤做了一个简单的介绍,其匹配出的结果是非常粗糙的,在这篇文章中对使用OpenCV2进行匹配的细化做一个简单的总结.主要包括以下 ...

  9. OpenCV39:特征匹配+单应性矩阵查找对象

    目标 在本章中,将学习 将从Calib3D模块中混淆特征匹配和找到(单应性矩阵)homography,以查找复杂图像中的已知对象. 基础 在之前的内容中,使用了一个query image,在其中找到了 ...

  10. OpenCV系列之特征匹配+单应性查找对象 | 四十五

    目标 在本章节中, 我们将把calib3d模块中的特征匹配和findHomography混合在一起,以在复杂图像中找到已知对象 基础 那么我们在上一环节上做了什么?我们使用了queryImage,找到 ...

最新文章

  1. 乘法器专题研究(内含所有类型乘法器)
  2. 这些你都了解么------程序员跳槽法则
  3. C语言关于符号#和##
  4. 获取窗口上指定控件集合 2012-08-22 16:14 498人阅读 评论(0) 收藏...
  5. ActionT 无参数委托详解
  6. 【LOJ#6682】梦中的数论(min_25筛)
  7. dft对称性 matlab实验,数字信号处理实验指导书(审)
  8. 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分
  9. 树莓派备份系统sd卡备份
  10. linux 网站获取数据失败,AnyBackup-Linux 环境下 Sybase 授权数据库实例时,提示错误:获取实例失败...
  11. Vm虚拟化连不上存储服务器,VMware服务器虚拟化、虚拟桌面应该选择什么存储品牌最好--我们有软硬方案...
  12. 清除Mac电脑缓存的方法,非常实用哦
  13. 7z001怎么解压在安卓手机上面_手机怎么解压zip文件 安卓手机zip文件怎么打开?...
  14. RNA-seq 详细教程:实验设计(2)
  15. 【2022 CCF BDCI 文心大模型创意项目】乐享词话—诗词意境辅助记忆工具
  16. 继承 封装 多态 (基础)描述性理解
  17. 硬件开发者之路之运放共模电压的解释
  18. 程序设计 | python | Hello World的条件输出
  19. PixiJS学习(10)事件机制
  20. [Swift]LeetCode832. 翻转图像 | Flipping an Image

热门文章

  1. jmeter压力测试+badboy脚本录制
  2. 地图比例尺与空间分辨率之间的关系_分辨率与比例尺
  3. python语音识别_Python语音识别终极指南
  4. python三对角矩阵_用NumPy实现三对角矩阵算法(TDMA)
  5. A轮、B轮、C轮融资、VC、PE、IPO概念解析
  6. 微信dat文件用什么软件打开方式_dat文件用什么打开 微信电脑图片dat转为jpg
  7. 联想电脑linux显卡驱动,哪里下载独立显卡驱动 急急急!!联想y470如何在linux下安装显卡驱动啊?你好...
  8. 干货 | 腾讯云智能语音行业落地探索与实践
  9. macOS图像文件不能正常显示缩略图预览怎么办?
  10. TMS320F280049C 串行通信接口Serial Communications Interface (SCI)之RS485通信(多摩川编码器)