我正在尝试使用本教程中的SURF (matcher.html)检测图像
我现在的目标是向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:为什么我得到的结果与本教程不同?
当为ex在knnMatch()中更改k的值时。6,将返回最近的6匹配。使用knn=2,为了找到好的匹配,我检查返回的匹配的距离不大于m1.distance < 0.8 * m2.distance。
问题2:在knn=6中,我应该使用哪一个6的匹配来比较距离不大于0.8*的距离?
发布于 2018-12-19 01:42:51
问题1:
我认为结果将与教程不同,因为搜索范围是不同的。本教程查找item1 of des1在des2中的匹配。然而,您正在寻找item1 of des1在des1和des2的结合中。
问题2:
比率测试由Low(SIFT作者)设计,以测量匹配点的唯一性。如果最佳匹配和第二最佳匹配之间的距离(分数/相似度)很大,这意味着最佳匹配是唯一的,并且图像中没有其他特征与其相似。然而,如果第二次最佳匹配接近最佳匹配,则意味着该特征不是唯一的,而且该特征可能是一个重复的模式,我们应该从匹配过程中抛弃它。
因此,通过使用k=6,您正在寻找最好的6个匹配,这无助于确定特性的唯一性,因为只有最好的和第二个最好的点重要。
也许您正在尝试从描述符的结合中聚集类似的点。那么比率测试在这种情况下是无用的,因为不再有唯一的匹配。
https://stackoverflow.com/questions/53794676
复制相似问题