使用SURF和FLANN比较图像与图像数据库

时间:2017-09-28 15:36:14

标签: python opencv flann

我试图将单张图片与图片数据库进行比较 我目前正在使用Python 2.7和OpenCV 3.3.0 经过一些谷歌搜索,我想出了这个代码:

scanned = 'tests/temp_bw.png'
surf = cv2.xfeatures2d.SURF_create(400)
surf.setUpright(True)

img1 = cv2.imread(scanned, 0)
kp1, des1 = surf.detectAndCompute(img1, None)

FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)

flann = cv2.FlannBasedMatcher(index_params, search_params)

for filename in os.listdir('images'):
    img2 = cv2.imread('images/' + filename, 0)
    kp2, des2 = surf.detectAndCompute(img2, None)
    flann.add([des2])

print str(len(flann.getTrainDescriptors()))

print "Training..."
flann.train()

print "Matching..."
indexes, matches = flann.knnSearch(des1, 2, params={})

主要问题是在OpenCV 3.3.0中,FlannBasedMatcher没有方法knnSearch。我检查了当前的代码文档,并且在2.4中有这样的方法,现在它被删除了。

OpenCV 3.3.0中是否有类似内容?
或者我应该使用不同的方法吗?

1 个答案:

答案 0 :(得分:1)

在OpenCV 3.3.0中,该函数称为knnMatch

可以在此页面的基于FLANN的Matcher下找到示例用法: http://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html

编辑: 对不起,我现在意识到我误解了你。 knnSearch函数现在位于flann.Index()下,可以按如下方式使用。确保描述符数据库和查询对象都是float32

flann = cv2.flann.Index()
print "Training..."
flann.build(des_all, index_params)
print "Matching..."
indexes, matches = flann.knnSearch(des1, 2)