4

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

我现在的目标是向 FlannBasedMatcher 添加多个图像,然后将其保存以便以后能够加载它。add()当从示例中更改代码并尝试train()调用 knnMatch(queryDescriptors=des1, k=2) 之前的描述符时(而不是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:为什么我得到的结果与教程中的不同?

当改变 k 的值时knnMatch(),例如。6,将返回最近的 6 个匹配项。在 knn=2 的情况下,为了找到好的匹配项,我检查返回匹配项的距离是否不大于m1.distance < 0.8 * m2.distance.

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

4

1 回答 1

3

问题一:

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

问题2:

比率测试是由 Low(SIFT 作者)设计的,用于衡量匹配点的唯一性。如果最佳匹配和次佳匹配之间的距离(在分数/相似度方面)很大,则意味着最佳匹配是唯一的,并且图像中没有其他特征与其相似。但是,如果第二个最佳匹配接近最佳匹配,则意味着该特征不是唯一的,并且该特征可能是我们应该从匹配过程中丢弃的重复模式。

因此,通过使用 k=6,您正在寻找最好的 6 个匹配项,这无助于确定特征的唯一性,因为只有最佳点和次佳点很重要。

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

于 2018-12-19T01:42:51.303 回答