OpenCV Python FlannBasedMatcher如何添加多个描述符?

4

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

现在我的目标是将多个图像添加到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的情况下,我应该使用哪一个匹配作为锚点来比较距离是否大于0.8倍的距离?

你正在使用SURF算法(该算法有特定的许可证),而教程中使用的是SIFT。使用两种不同的选择算法得到不同的结果并不奇怪。 - T.Lucas
我正在比较flann.knnMatch(des1, des2)和flann.add(des1), train, flann.knnMatch(des2)的结果。因此,所使用的算法并不重要。(我也用SIFT进行了测试) - suizo
1个回答

3

问题1:

我认为结果会与教程不同,因为搜索范围不同。教程在des2中查找des1的item1的匹配项。然而,您正在寻找des1和des2的并集中的des1的item1。

问题2:

比值测试是由Low(SIFT作者)设计的,用于测量匹配点的唯一性。如果最佳匹配和次佳匹配之间的距离(以得分/相似度表示)很大,则意味着最佳匹配是唯一的,图像中没有其他特征类似于它。然而,如果次佳匹配接近最佳匹配,则意味着该特征不是唯一的,并且该特征可能是重复的模式,我们应该从匹配过程中舍弃它。

因此,使用k = 6,您正在寻找最佳的6个匹配项,这对于确定特征的唯一性没有帮助,因为只有最佳匹配和次佳匹配点才有意义。

也许您正在尝试从描述符的并集中聚类相似的点。那么在这种情况下,比率测试是无用的,因为不再存在唯一的匹配。


对于问题1:我打错了一个字。我添加了des1 - train它,然后将其与des2进行比较,得到了一个奇怪的不同结果,我无法解释。 - suizo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接