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

相关推荐
苦瓜汤补钙几秒前
论文阅读:RGBD GS-ICP SLAM
论文阅读·人工智能·重构
LNTON羚通4 分钟前
明烟明火检测算法、烟火检测、森林防火检测
大数据·网络·人工智能·算法·音视频
爱上杨小厨11 分钟前
MFC实现对话框与控件的自适应调节
c++·mfc
小楼先森26 分钟前
【目标检测数据集】工具螺丝刀2860张VOC+YOLO格式
人工智能·yolo·目标检测
阿里云大数据AI技术29 分钟前
阿里云Elasticsearch AI搜索实践
人工智能·elasticsearch·阿里云·rag
一尘之中32 分钟前
链路聚合(Link Aggregation)
网络·人工智能·学习
ACRELKY1 小时前
新能源汽车光储充一体化设计
网络·人工智能·汽车
Bill661 小时前
MFC之CString类及其成员函数用法详解
c++·mfc
张小生1801 小时前
《深度学习》—— 神经网络模型中的损失函数及正则化惩罚和梯度下降
人工智能·深度学习·神经网络
MogulNemenis1 小时前
力扣100题——技巧
算法·leetcode