OpenCV 中有两种特征匹配方法:暴力匹配 (Brute force matching) 和 最近邻匹配 (Nearest Neighbors matching)
它们都继承自 DescriptorMatcher,是基于特征描述符距离的匹配,根据描述符的不同,距离可以是 欧氏距离,也可以是 汉明距
1 暴力匹配
首先,任取图像 A 的一个特征描述符,计算它到图像 B 中所有特征描述符的距离;然后,将所得到的距离进行排序;最后,选择距离最短的特征,作为 A-B 的匹配点
1.1 BFMatcher
BFMatcher 属于 features2d 模块,继承自 DescriptorMatcher,其 create() 函数如下:
static Ptr<BFMatcher> create(
int normType = NORM_L2, // normType, One of NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2.
bool crossCheck = false // crossCheck
);
1) normType 距离类型
SIFT和SURF 的 HOG 描述符,对应欧氏距离 L1 和 L2;ORB 和 BRISK 的 BRIEF 描述符,对应汉明距 HAMMING;HAMMING2 则对应当 WTA_K = 3或4 时的 ORB 算法
- 欧氏距离:最常用的一种距离定义,指的是 n 维空间中,两点之间的实际距离
- 汉明距离:计算机的异或操作,适用于二进制串描述符,如 BRIEF 描述符,定义如下:
2) crossCheck 交叉核对
- 如果在图像 B 中,特征 是特征 的最佳匹配,并且在图像 A 中