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

相关推荐
京和动物医院·总院1 分钟前
2026年未央区宠物医院:如何挑选最适合您爱宠的健康守护者
大数据·人工智能·python
液态不合群1 分钟前
AI×低代码工作流:破解制造业数字化流程异构困局
人工智能·低代码
武子康2 分钟前
Copilot Code Review 从固定 Reviewer 演进为可编程 Runtime,仓库控制面、Setup 供应链、Runner 资源和 MCP 工具同时被纳入审查决策
人工智能·github·aigc
吠品2 分钟前
五子棋AI对战功能实现与多难度策略设计
人工智能
刘小八3 分钟前
RAG 文档切分不是越细越好:选择 Chunk Size 与 Overlap
人工智能·python·语言模型
商业模式源码开发8 分钟前
2026年GEO优化全解析:生成式引擎优化如何重构企业流量与品牌护城河
大数据·人工智能·ai
乐观勇敢坚强的老彭14 分钟前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光16 分钟前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
变量未定义~19 分钟前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
对讲机数码科普21 分钟前
黑龙江应急救援单工通信保障方案设计与实战应用
大数据·网络·人工智能