OpenCV python FlannBasedMatcher添加多个描述符

时间:2018-12-15 15:38:23

标签: python opencv flann flannbasedmatcher

我正在尝试按照本教程(https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.html)使用SURF来检测图像

我现在的目标是将多个图像添加到FlannBasedMatcher,然后将其保存以便以后加载。当从示例中更改代码并尝试在调用knnMatch(queryDescriptors = des1,k = 2)之前尝试使用add()train()描述符时(而不是matches = flann.knnMatch(des1,des2,k=2)时,我得到了其他结果教程示例。

surf = cv2.xfeatures2d.SURF_create(800)
...
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)   # or pass empty dictionary
...
flann = cv2.FlannBasedMatcher(index_params,search_params)
flann.add(des1)
flann.train()
flann.knnMatch(queryDescriptors=des2, k=2)

问题1:为什么我得到的结果与本教程中的结果不同?

例如,在knnMatch()中更改k的值时。 6,将返回最接近的6个匹配项。使用knn = 2时,要查找良好的匹配项,请检查返回的匹配项的距离不大于m1.distance < 0.8 * m2.distance

问题2:在knn = 6的情况下,我应该使用6的哪个匹配作为锚点,以比较距离不大于0.8 *距离?

1 个答案:

答案 0 :(得分:0)

问题1:

我认为结果会与本教程不同,因为搜索范围不同。本教程在des2中找到des1的item1的匹配项。但是,您要在des1和des2的并集中寻找des1的item1。

问题2:

比率测试由Low(SIFT作者)设计,用于测量匹配点的唯一性。如果最佳匹配和次最佳匹配之间的距离(以得分/相似度为单位)较大,则表示最佳匹配是唯一的,并且图像中没有其他特征与之相似。但是,如果次最佳匹配接近最佳匹配,则表示该功能不是唯一的,并且该功能可能是重复模式,应从匹配过程中将其丢弃。

因此,使用k = 6时,您正在寻找最佳的6个匹配项,这对确定功能的唯一性没有帮助,因为仅最佳和次要点才重要。

也许您正在尝试将描述符联合中的相似点聚类。那么比率测试在这种情况下就没有用了,因为不再有唯一匹配。