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

相关推荐
捕鲸叉9 分钟前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer13 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq15 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
wheeldown42 分钟前
【数据结构】选择排序
数据结构·算法·排序算法
阡之尘埃43 分钟前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
青花瓷2 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
观音山保我别报错2 小时前
C语言扫雷小游戏
c语言·开发语言·算法
孙同学要努力3 小时前
全连接神经网络案例——手写数字识别
人工智能·深度学习·神经网络
Eric.Lee20213 小时前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
幺零九零零3 小时前
【C++】socket套接字编程
linux·服务器·网络·c++