目标
在本章中,
我们将看到如何将一个图像中的特征与其他图像进行匹配。
我们将在OpenCV中使用Brute-Force匹配器和FLANN匹配器
Brute-Force匹配器的基础
蛮力匹配器很简单。它使用第一组中一个特征的描述符,并使用一些距离计算将其与第二组中的所有其他特征匹配。并返回最接近的一个。
对于BF匹配器,首先我们必须使用cv.BFMatcher()创建BFMatcher对象。
它需要两个可选参数。第一个是normType,它指定要使用的距离测量。默认情况下为cv.NORM_L2
。对于SIFT,SURF等(也有cv.NORM_L1
)很有用。
对于基于二进制字符串的描述符,例如ORB,BRIEF,BRISK等,应使用cv.NORM_HAMMING
,该函数使用汉明距离作为度量。如果ORB使用WTA_K == 3
或4
,则应使用cv.NORM_HAMMING2。
第二个参数是布尔变量,即crossCheck,默认情况下为false。如果为true,则Matcher仅返回具有值(i,j)的那些匹配项,以使集合A中的第i个描述符具有集合B中的第j个描述符为最佳匹配,反之亦然。即两组中的两个特征应彼此匹配。它提供了一致的结果,并且是D.Lowe在SIFT论文中提出的比率测试的良好替代方案。
创建之后,两个重要的方法是BFMatcher.match()和BFMatcher.knnMatch()。第一个返回最佳匹配。第二种方法返回k个最佳匹配,其中k由用户指定。当我们需要对此做其他工作时,它可能会很有用。
就像我们使用cv.drawKeypoints()绘制关键点一样,cv.drawMatches()可以帮助我们绘制匹配项。它水平堆叠两张图像,并绘制从第一张图像到第二张图像的线,以显示最佳匹配。还有cv.drawMatchesKnn绘制所有k个最佳匹配。如果k=2
,它将为每个关键点绘制两条匹配线。因此,如果要选择性地绘制,则必须通过掩码。
让我们来看一个SIFT和ORB的示例(两者都使用不同的距离测量)。