特征匹配如何避免误/漏匹配
文章目录
代码参见:GitHub
1 度量函数
1.1 欧氏距离
L2
距离,是最常见的度量函数之一。它衡量了两个特征点之间的直线距离。在特征匹配中,通常用来比较特征向量的差异。
d
E
(
a
,
b
)
=
∑
i
=
1
n
(
a
i
−
b
i
)
2
d_E(\mathbf{a},\mathbf{b})=\sqrt{\sum_{i=1}^n(a_i-b_i)^2}
dE(a,b)=i=1∑n(ai−bi)2
应用于浮点型描述子,SIFT、 SURF描述子
1.2 汉明距离
汉明距离是指两个等长字符串之间对应位置上不同字符的个数。在特征匹配中,用来度量两个二进制特征向量之间的差异程度。
d
H
(
a
,
b
)
=
∑
i
=
1
n
diff
(
a
i
,
b
i
)
d_H(a,b)=\sum_{i=1}^n\operatorname{diff}(a_i,b_i)
dH(a,b)=i=1∑ndiff(ai,bi)
应用:BRIRF特征描述子(ORB采用)
2 暴力匹配
对于每个图像中的特征点,计算它们与另一个图像中所有特征点的距离。通常费力不讨好(后续实验结果均以相同的两张图片作为对比)
2 距离筛选
距离筛选是在特征匹配过程中用来剔除不合适的匹配点,以提高匹配的准确性和鲁棒性的一种技术。在特征匹配中,通常会计算两个特征描述子之间的距离(如欧氏距离、汉明距离等),然后根据一定的阈值或规则来筛选匹配点。
实验:暴力匹配后,选择距离最小值的二倍为阈值,大于该阈值的都认为是外点。
3 KNN匹配
KNN实际上也是一种距离筛选,一般选择K=2。对于每个特征点,在其最近邻和次近邻之间计算距离比率。如果最近邻的距离远小于次近邻的距离,通常说明该匹配是可靠的。这是因为如果两个描述子非常相似,那么它们的次近邻距离也应该接近。比率测试的典型阈值范围为0.6到0.8。
4 RANSAC外点剔除
RANSAC算法需要寻找一个最优单应性矩阵H,矩阵大小为3×3。利用RANSAC算法找到的最优单应性矩阵H需要使得满足该矩阵的匹配特征点最多。由于常常令h33=1来归一化矩阵,所以单应性矩阵H只有8个未知参数,所以至少需要8个线性方程才能进行求解,而对应到点位置信息上,一组特征匹配点可以得到两个线性方程,因此至少需要4组特征匹配点对才能求解得到单应性矩阵H。
所以每次从样本中随机抽取4对点(非共线)去计算单应矩阵H,然后用求解的H投影计算其它剩余的所有特征点对,分别统计误差和内点数量。重复实验多次,最后选取最优的结果。
具体RANSAC求解单应矩阵H请参考ORB-SLAM初始化,里面写的很详细了
5 ORB旋转直方图
利用ORB特征点的旋转不变性。原理是统计两张图像所有匹配对中两个特征点主方向的差,构建一个直方图。由于两张图像整体发生了运动,因此特征点匹配对主方向整体会有一个固定一致的变化。通常直方图中前三个最大的格子里就是正常的匹配点对,那些误匹配的特征点对此时就会暴露出来,落在直方图之外的其他格子里,这些就是需要剔除的错误匹配。
- 先用KNN匹配(这里KNN和上面KNN结果不同,因为上面opencv提取的ORB特征点,会比较集中,这里是用OBR-SLAM里面四叉树均匀提取的)
- 旋转直方图剔除外点
6 交叉匹配
交叉匹配:就是两帧互相匹配,只有两帧中同时都能匹配的点认为匹配正确。
以ORB-SLAM闭环线程为例(参见):
在闭环线程中,闭环候选帧和当前关键帧最早是通过词袋进行搜索匹配的。这是因为它们间隔的时间比较远,没有先验信息,这时用词袋搜索是最合适的。
但是词袋搜索会导致漏匹配。而成功的闭环需要在闭环候选帧和当前帧之间尽可能多地建立更多的匹配关系,这时可以利用初步估计的Sim(3)位姿进行相互投影匹配,忽略已经匹配的特征点,只在尚未匹配的特征点中挖掘新的匹配关系。
7 ORB初始化匹配
类似于光流,小运动相应的匹配点肯定在一个范围内!
8 VINS中的做法
对所有的特征点排序,按照追踪的次数排序。显然,被追踪的次数多的点,通常比较好。因为被追踪的次数多,说明这个特征点比较稳定,就更应该保留下来(也更小概率是奇葩点)。排序完后,就进行均匀化的操作,不同于orb slam四叉树的均匀化的操作。具体的过程,是在被选中的重要点为中心,周围画一个圈,这个圈内不允许有别的特征点的存在,避免特征点过于集中。
现在我们已经剔除掉很多特征点了,我们需要再提取一些特征点来保证特征点的总量够用。特征点的提取用的函数是opencv的函数:goodfeaturetotrack。他是在灰度图行进行提取特征用的函数。这个函数里本身也带有特征点均匀化的功能。
最后调用addPoints函数,把新提取的特征点,加入进容器了。当然,新的特征点的追踪次数也设置为1,因为都是刚刚追踪到的。
9 IMU预测
估计姿态r t,通过一个预测的姿态,去进行一个搜索半径估计
参考MSCKF、VINS