ORB-SLAM2系列(四)-特征匹配
ORB-SLAM2在不同已知条件和情况下使用了11种匹配方法,下面进行简单总结,具体细节看源码,默认使用八层金字塔,每层最大特征点数:设置数(初始化2000,平常1000)x 0.217(0.181、0.151、0.126、0.105、0.087、0.073),相机内参都已知
-
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非线性优化也会排除一些误匹配 -
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)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。 -
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)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。 -
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)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。 -
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 -
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)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。 -
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点的用观察多的替换观察少的,没有的关联起来即可。 -
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)整体方向判断:最后验证特征点方向(帧与帧之间可以验证方向)。 -
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点,一致才加入第三个参数 -
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) -
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特征点关联。