【Orb-Slam3学习】 特征匹配函数的目的与分类

特征匹配函数的目的

特征匹配的目的大致有3个:

1、特征点最朴素的匹配方式的暴力匹配,但是暴力匹配过于耗时。从而在Orb-Slam3中为快速进行特征点匹配创建了多个特征匹配函数。

此目的采用缩小特征点搜索范围达到,具体由以下三种方式达到:

1、利用地图点投影至当前帧,缩小搜索范围。搜索半径有特征点金字塔尺度相关联;

2、利用词袋模型搜索,每个描述子转化为单词后会包含一个属性,叫作单词所属的节点ID,这个节点ID 距离叶子的层级就是 level up。在进行特征匹配时,只在该单词所属的节点ID内部搜索即可。通常设置 level up=3。只需要在同一个节点下搜索候选匹配点,不需要地图点投影所以匹配效率很高。

3、在初始化阶段,没有地图点这些先验信息,则通过上一帧的特征点的位置信息,在当前帧的同样位置的区域内搜索特征点,但此时搜索范围比1)的范围大的多。搜索半径为100.

2、利用词袋、地图点、sim3来增加更多的匹配关系。

3、当SLAM系统长时间运行后,由于时间久远,没有先验信息。此时采用词袋模型匹配是更好的选择。

Orb-Slam3特征匹配的函数如下:

复制代码
//用于局部地图点跟踪,用所有局部地图点通过投影进行特征点匹配
int SearchByProjection(Frame &F, const std::vector<MapPoint*> &vpMapPoints, const float th=3, const bool bFarPoints = false, const float thFarPoints = 50.0f);
//用于恒速模型跟踪,用前一个普通帧投影到当前帧中进行匹配
int SearchByProjection(Frame &CurrentFrame, const Frame &LastFrame, const float th, const bool bMono);
//用于重定位跟踪,将候选关键帧中未匹配的地图点投影到当前帧中,生成新的匹配
int SearchByProjection(Frame &CurrentFrame, KeyFrame* pKF, const std::set<MapPoint*> &sAlreadyFound, const float th, const int ORBdist);
//用于闭环线程,将闭环关键帧及其共视关键帧的所有地图点投影到当前关键帧中进行投影匹配
int SearchByProjection(KeyFrame* pKF, Sophus::Sim3<float> &Scw, const std::vector<MapPoint*> &vpPoints, std::vector<MapPoint*> &vpMatched, int th, float ratioHamming=1.0);
//位置识别(Place Recognition)中,主要用于闭环检测(Loop Closing)和地图融合(Merging)。
int SearchByProjection(KeyFrame* pKF, Sophus::Sim3<float> &Scw, const std::vector<MapPoint*> &vpPoints, const std::vector<KeyFrame*> &vpPointsKFs, std::vector<MapPoint*> &vpMatched, std::vector<KeyFrame*> &vpMatchedKF, int th, float ratioHamming=1.0);
//通过词袋搜索匹配,用于刚刚初始化后跟踪参考关键帧中的快速匹配,
int SearchByBoW(KeyFrame *pKF, Frame &F, std::vector<MapPoint*> &vpMapPointMatches);
//通过词袋搜索匹配,用于闭环计算 sim(3)时当前关键帧和闭环候选关键帧之间快速匹配
int SearchByBoW(KeyFrame *pKF1, KeyFrame* pKF2, std::vector<MapPoint*> &vpMatches12);
//用于单目初始化时只在原图上进行的区域搜索匹配
int SearchForInitialization(Frame &F1, Frame &F2, std::vector<cv::Point2f> &vbPrevMatched, std::vector<int> &vnMatches12, int windowSize=10);
//通过词袋搜索匹配,用于局部建图线程中两两关键帧之间
// 尚未匹配特征点的快速匹配,为了生成新的匹配点对
int SearchForTriangulation(KeyFrame *pKF1, KeyFrame* pKF2,
                                   std::vector<pair<size_t, size_t> > &vMatchedPairs, const bool bOnlyStereo, const bool bCoarse = false);
//用于比环线程中sim3变换,对当前关键帧和闭环候选关键帧相互投影匹配、生成更多的匹配点对
int SearchBySim3(KeyFrame* pKF1, KeyFrame* pKF2, std::vector<MapPoint *> &vpMatches12, const Sophus::Sim3f &S12, const float th);

特征匹配函数分类

特征匹配函数大致分为3种:

词袋(DBoW):

SearchByBoW SearchForTriangulation

地图点投影(MapProjection):

SearchByProjection

Sim3变换:

SearchBySim3

特征点筛选原则

其中特征点筛选大致靠3个原则:

1、最优与次优的描述子距离之比。 (默认0.6)

2、最优的描述子距离应小于阈值。 (TH_LOW = 50)

3、经过方向一致性检验。

具体使用的匹配帅选原则由具体函数绝对:

有些函数没有原则1(最优与次优的描述子距离之比)和原则3(经过方向一致性检验)比如SearchBySim3。

其中有两个特殊特征匹配函数SearchBySim3、SearchForTriangulation。

其中SearchBySim3筛选匹配关系有双向投影关系约束,十分严格。

而SearchForTriangulation则有对极约束(三角化之后的重投影约束)和极点约束(极点e2到kp2的像素距离如果小于阈值th,认为kp2对应的MapPoint距离pKF1相机太近,跳过该匹配点对,作者根据kp2金字塔尺度因子(scalen,scale=1.2,n为层数)定义阈值th)。

相关推荐
简简单单做算法2 小时前
基于mediapipe深度学习和限定半径最近邻分类树算法的人体摔倒检测系统python源码
人工智能·python·深度学习·算法·分类·mediapipe·限定半径最近邻分类树
Tisfy3 小时前
LeetCode 2360.图中的最长环:一步一打卡(不撞南墙不回头) - 通过故事讲道理
算法·leetcode··题解
LuckyAnJo3 小时前
Leetcode-100 链表常见操作
算法·leetcode·链表
就决定是你啦!3 小时前
机器学习 第一章 绪论
人工智能·深度学习·机器学习
双叶8364 小时前
(C语言)虚数运算(结构体教程)(指针解法)(C语言教程)
c语言·开发语言·数据结构·c++·算法·microsoft
工一木子4 小时前
大厂算法面试 7 天冲刺:第5天- 递归与动态规划深度解析 - 高频面试算法 & Java 实战
算法·面试·动态规划
有个人神神叨叨5 小时前
OpenAI发布的《Addendum to GPT-4o System Card: Native image generation》文件的详尽笔记
人工智能·笔记
林九生5 小时前
【Python】Browser-Use:让 AI 替你掌控浏览器,开启智能自动化新时代!
人工智能·python·自动化
liuyunshengsir6 小时前
AI Agent 实战:搭建个人在线旅游助手
人工智能·旅游
Shawn_Shawn6 小时前
大模型微调介绍
人工智能