【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)。

相关推荐
Wils0nEdwards2 分钟前
Leetcode 串联所有单词的子串
java·算法·leetcode
埃菲尔铁塔_CV算法16 分钟前
新型滤波算法在信号处理中的创新与应用
算法·信号处理
zaim123 分钟前
计算机的错误计算(一百八十七)
人工智能·ai·大模型·llm·错误·正弦/sin·误差/error
XZHOUMIN30 分钟前
【MFC】如何修改多文档视图的标签
c++·mfc
toto41233 分钟前
Java中的锁机制 与 synchronized的理解
java·算法
请你喝好果汁64136 分钟前
机器学习架起了组学科学和植物育种之间的桥梁。
linux·人工智能·机器学习
合合技术团队1 小时前
高效准确的PDF解析工具,赋能企业非结构化数据治理
人工智能·科技·pdf·aigc·文档
越甲八千1 小时前
重拾设计模式--外观模式
c++·设计模式·外观模式
瞻邈1 小时前
lpips使用笔记
人工智能·python·深度学习
刘好念1 小时前
[OpenGL]使用TransformFeedback实现粒子效果
c++·计算机图形学·opengl