ORB-SLAM2系列(四)-特征匹配

ORB-SLAM2系列(四)-特征匹配


ORB-SLAM2在不同已知条件和情况下使用了11种匹配方法,下面进行简单总结,具体细节看源码,默认使用八层金字塔,每层最大特征点数:设置数(初始化2000,平常1000)x 0.217(0.181、0.151、0.126、0.105、0.087、0.073),相机内参都已知

  1. searchforinitalization(1F,2F,第一帧特征点,匹配点(F1.size),windowsize=10):初始化时用,windowsize=100,nnratio=0.9,checkori=true。为了使精度更好只要2帧金字塔第一层特征点(434-434个点)。
    1)目的:寻找1F、2F之间匹配点
    2)已知条件:没有任何先验信息
    3)搜索潜在匹配点:以第一帧特征点为外循环,在第二帧中以第一帧特征点坐标windowsize x 2正方形像素窗口找特征点。第二次匹配上,取最好的。
    4)描述子(2D-2D)距离判断:汉明距离(最大为256)越小越相近,判断为匹配的距离需满足<TH_LOW(50),best<0.9 x best2。
    5)整体方向判断:两帧会有一定旋转角度,那么两帧匹配的ORB特征点方向相差的角度应该是一样的,与大多数点角度差相差较大的点应判定为误匹配。代码中具体实现方法如下:将匹配点的角度差装入不同差值段的bin中,统计数量,数量最多的几个可认为是正确的差值,可将其作为参考值。若数量最多的几个bin与其它bin数量相差不大,则说明两帧匹配效果不佳。
    以下是去除异常匹配点操作:
    6)FindF、H:使用8点法的RANSAC利用F(x1Fx2=0、x2Fx1=0)和H(p1-Hp2=0,p2-Hp1=0)约束去掉一些异常点
    7)CheckRT():利用匹配点三角化后3d点在相机前方(z>0)去掉一些异常点,注意平行(cos>=0.00002)时,可以不大于0,即该点为无穷远点
    8)三角化后3d点投影到两帧图的重投影误差都小于4个像素
    重建成功后一般还剩100个点左右,要求>50个。
    9)g2o非线性优化也会排除一些误匹配

  2. Searchbyprojection(cF,lF,查找正方形范围边长th=15,bool mono):motion中currentF跟踪lastF时, match小于20,th改为30,pose优化后还需保留10个点以上才算成功,checkori=true;
    1)目的:在lastF的3D点中寻找与cF特征点的匹配点
    2)已知条件:lF对应的路标点和相机外参都已知,cF的相机外参已知,两帧相对位姿假设为v x Δt;)
    3)搜索潜在匹配点:将lF的所有非null和非outlier的3D点转换到cF坐标系,再投影到cF像素坐标系
    a)深度z为正
    b)投影后像素坐标不超过图片校正后的边界
    c)根据投影后像素坐标搜索(双目有所不同):r=th x lF该点所在层缩小倍数(不是原图层特征可能没那么准),先取mgrid(64 x 48)正方形内对应特征,然后取3D点所在lF层和前后层,共三层的点。第二次匹配上直接跳过。
    4)描述子(3D-2D)距离判断:满足<TH_HIGH(100)。
    5)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。

  3. Searchbybow(rKF,cF,cF对应3d点):cF跟踪referenceKF时,特征匹配>=15,pose优化后>=10,nnratio=0.7,checkori=true;重定位,从多个候选帧(太多影响速度)找与cF匹配点>=15,nnratio=0.75,checkori=true;
    1)目的:在rKF的2d特征点暴力与cF特征点匹配
    2)已知条件:rKF对应的路标点(匹配时不用,pose优化才用)和相机外参都已知,rKF和cF(使用前算得)的mfeatvec(node(第4层),特征容器)已知
    3)搜索潜在匹配点:2帧相同node特征进行暴力匹配,外层为rKF的特征点,选取非null和非isbad(localmapping会更改)3D点,内层cF相同node所有点,内层若被第二次匹配直接跳过。
    4)描述子(2D-2D)距离判断:满足<TH_LOW(50),best< nnratio x best2。
    5)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。

  4. Searchbyprojection(cF,KF,已经匹配到3D点,边长th,ORBdist):重定位,根据判断条件,checkori=true,可能会使用2次,1-th=10,ORBdist=100,2(位姿又一次优化)-th=3,ORBdist=64;
    1)目的:在KF的3D点中寻找除cF已经匹配到的3D点以外的点,即新增点
    2)已知条件:KF对应的路标点和相机外参都已知,cF已经匹配的3D点,cF的pose已知,且已经过优化(reloc),较准确
    3)搜索潜在匹配点:将KF的所有3D点转换到cF坐标系,再投影到cF像素坐标系
    a) 非null和非isbad、非已经匹配
    b) 深度z为正(未加)
    c) 投影后像素坐标不超过图片校正后的边界
    d) 3D点与cF光心距离未超出3D点最大、小距离(路标点属性,理论上路标点只能在一定范围内看到)
    e) 根据投影后像素坐标搜索(双目有所不同):r=th*该点在cF中预测到所在层缩小倍数(不是原图层特征可能没那么准),先取mgrid(64 x 48)正方形内对应特征,然后取3D点所在cF预测层和前后层,共三层的点。第二次匹配上直接跳过。
    4)描述子(3D-2D)距离判断:满足<= ORBdist。
    5)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。

  5. Searchbyprojection(cF,localmappoints,th):tracklocalmap时,正常th=1,刚重定位完(<2)th=5,viewingcoslimit=0.5, nnratio=0.8;
    1)目的:跟踪localmappoints中在frustm内的点
    2)已知条件:经过isinfrustm(viewingcoslimit)判断的localmappoints,cF已经跟踪到的3D点(trackinview=false)不再重复投影,cF的pose已知
    3)Isinfrustm(viewingcoslimit):判断某3D点是否在当前帧的射影锥内(针孔模型),满足trackinview=true,否则trackinview=false
    a) 将3D点世界坐标转换到当前帧坐标系,深度z>0
    b) 重投影不超过图片校正后的边界
    c) 3D点与cF光心距离未超出3D点最大、小距离
    d) 射线与3D点方向夹角的余弦viewingcos< viewingcoslimit
    4)从localmappoints搜索潜在匹配点:外循环3D点,
    a) trackinview=true
    b) 非isbad()
    c) 根据viewingcos选择r(通常是4,大于0.998取2.5),在重投影坐标周围r x th x predictscale的缩放倍数,cF第predictscale-1和predictscale两层找潜在匹配点。第二次且观察到帧大于0的cF特征点直接跳过。
    5)描述子(3D-2D)距离判断:满足<TH_HIGH(100),best< nnratio x best2||bestlevel!=best2level

  6. Searchfortriangulation(pKF1,pKF2,matched<idx1,idx2>,onlystereo):localmaping三角化新增3D点时,首先判断当前帧(pKF1)和共视帧pKF2baseline(相机中心的距离)是否足够(baseline/共视帧深度中值>0.01),最后匹配点是否能三角化还得两帧看同一个点射线夹角余弦值大于0小于0.9998,即大于1.15°小于90°。
    1)目的:寻找pKF1、pKF2除以及匹配好的3D点外特征点的匹配,并将匹配结果存在matched<idx1,idx2>
    2)已知条件:pKF1,pKF2已经匹配好的3D点和比较准确的位姿(那么可以求出F12)
    3)搜索潜在匹配点:外层pKF1的相同节点的除3D点外所有特征点,内层pKF2的相同节点的除3D点外所有特征点,第二次匹配直接跳过
    4)描述子(2D-2D)距离判断:满足<TH_LOW(50),dist<bestdist
    5)得到pKF2的特征点与极点(pKF1的光心在pKF2像素平面的投影)差的二范数平方>100 x 该特征点所在层的缩放因子
    6)极线约束(理论上x1TF12x2=0):x1TF12x2(极线l=x1TF12前两个系数的平方和,抵消尺度<3.84 x pKF2特征点所在层的缩放因子平方
    7)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。

  7. fuse(pKF,vpmappoints,th=3):localmapping3D点融合时,先假设pKF所有特征点没有3D点,th=3,匹配后再融合,已有3D点的用观察多的替换观察少的,没有的关联起来即可。
    1)目的:先假设pKF所有特征点没有3D点,匹配后再融合,已有3D点的用观察多的替换观察少的,没有的关联起来即可。
    2)已知条件:3D点世界坐标,pKF的pose以及已经匹配的3D点
    3)搜索潜在匹配点:将所有3D点转换到pKF坐标系,再投影到pKF像素坐标系
    a) 非null、非isbad和pKF尚未观察到该点的3D点
    b) 深度z为正
    c) 投影后像素坐标不超过图片校正后的边界
    d) 3D点与cF光心距离未超出3D点最大、小距离
    e) 3D点与cF光心射线与3D点normal方向的余弦值>0.5(即<60°)
    f) 根据投影后像素坐标搜索:r=th x 3D点预测层缩放倍数周围,3D点预测层及其前一层(-1)2层找潜在匹配点
    g) 3D点重投影误差小于5.99 x 特征点所在层数缩放倍数平方
    4)描述子(3D-2D)距离判断:满足<TH_LOW(50)
    5)融合:已有3D点的用观察多的替换观察少的,没有的关联起来即可。

  8. Searchbybow(pKF1,pKF2,pKF1对应索引数内容为pKF2的3D点):闭环检测查找当前帧pKF1和闭环候选帧pKF2匹配3D点时,nnratio=0.75,checkori=true,匹配点需要>=20;
    1)目的:利用featvec暴力匹配pKF1,pKF2的3D点,使用是2D点描述子
    2)已知条件:pKF1,pKF2中的3D点,但pKF2的尺度、pose和3D坐标有漂移。
    3)搜索潜在匹配点:2帧相同node特征进行暴力匹配,外层为pKF1的特征点,选取非null和非isbad(localmapping会更改)3D点,内层pKF2相同node所有点,选取非null和非isbad(localmapping会更改)3D点,内层若被第二次匹配直接跳过。
    4)描述子(2D-2D)距离判断:满足<TH_LOW(50),best< nnratio x best2。
    5)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。

  9. Searchbysim3(pKF1,pKF2,pKF1对应索引数内容为pKF2的3D点,s12,R12,t12,th):闭环检测时求解出相似变换后,寻找当前帧pKF1和闭环候选帧pKF2更多的匹配3D点
    1)目的:利用pKF1投影到pKF2,寻找pKF1、pKF2已经匹配到3D点之外的点
    2)已知条件:pKF1,pKF2中的3D点和已经匹配的3D点,以及它们之间的相似变换
    3)搜索潜在匹配点:外循环pKF1非null、未与pKF2匹配和非isbad的3D点,内循环pKF2非null、未与pKF1匹配和非isbad的3D点
    a) 将pKF1的3D点通过相似变换转换的pKF2坐标系
    b) 深度z为正
    c) 投影后像素坐标不超过图片校正后的边界
    d) 3D点与cF光心距离未超出3D点最大、小距离
    e) 根据投影后像素坐标搜索:r=th x 3D点预测层缩放倍数周围,3D点预测层及其前一层(-1)2层找潜在匹配点
    4)描述子(3D(pKF1)-2D(pKF2))距离判断:满足<=TH_HIGH(100)
    5)搜索潜在匹配点:外循环pKF2非null、未与pKF2匹配和非isbad的3D点,内循环pKF1非null、未与pKF1匹配和非isbad的3D点
    f) 将pKF2的3D点通过相似变换转换的pKF1坐标系
    g) 深度z为正
    h) 投影后像素坐标不超过图片校正后的边界
    i) 3D点与cF光心距离未超出3D点最大、小距离
    j) 根据投影后像素坐标搜索:r=th x 3D点预测层缩放倍数周围,3D点预测层及其前一层(-1)2层找潜在匹配点
    6)描述子(3D(pKF2)-2D(pKF1))距离判断:满足<=TH_HIGH(100)
    7)检查两次匹配结果是否一样,选择2次匹配一致的3D点,一致才加入第三个参数

  10. Searchbyprojection(pKF,scw,vppoints,vpmatched(索引与pKF对应),th):闭环检测时,用于由闭环帧及其共视帧看到的vppoints建立与pKF除已匹配到的3D点vpmatched以外特征点的匹配
    1)目的:从vppoints建立与pKF除已匹配到的3D点vpmatched以外特征点的匹配
    2)已知条件:3D点到pKF坐标系的相似变换
    3)搜索潜在匹配点:外循环vppoints未与pKF2匹配和非isbad的3D点,内循环pKF未匹配到3D点的特征点
    a) 将vppoints的3D点通过相似变换转换的pKF坐标系
    b) 深度z为正
    c) 投影后像素坐标不超过图片校正后的边界
    d) 3D点与pKF光心距离未超出3D点最大、小距离
    e) 3D点与pKF光心射线与3D点normal方向的余弦值>0.5(即<60°)
    f) 根据投影后像素坐标搜索:r=th*3D点预测层缩放倍数周围,3D点预测层及其前一层(-1)2层找潜在匹配点
    4)描述子(3D-2D)距离判断:满足<=TH_LOW(50)

  11. fuse(pKF,scw,vppoints,th,vpreplace(索引与vppoints对应,内容为pKF对应的3D点):闭环检测时,用于由闭环帧及其共视帧看到的vppoints建立与当前帧及其共视帧pKF除已替换(已换成了vppoints)的3D点以外特征点的匹配,th=4
    1)目的:从vppoints建立与pKF除已替换(已换成了vppoints)的3D点以外特征点的匹配
    2)已知条件:3D点到pKF坐标系的相似变换
    3)搜索潜在匹配点:外循环vppoints未与pKF匹配和非isbad的3D点,内循环pKF未匹配到3D点的特征点
    a) 将vppoints的3D点通过相似变换转换的pKF坐标系
    b) 深度z为正
    c) 投影后像素坐标不超过图片校正后的边界
    d) 3D点与pKF光心距离未超出3D点最大、小距离
    e) 3D点与pKF光心射线与3D点normal方向的余弦值>0.5(即<60°)
    f) 根据投影后像素坐标搜索:r=th*3D点预测层缩放倍数周围,3D点预测层及其前一层(-1)2层找潜在匹配点
    4)描述子(3D-2D)距离判断:满足<=TH_LOW(50)
    5)若匹配点已有3D点,将结果存在vpreplace,待之后替换,没有3D点则直接建立与pKF特征点关联。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值