OpenCV和Python:knnMatch参数问题

0 投票
1 回答
5293 浏览
提问于 2025-04-18 10:16

我正在尝试按照这个 opencv教程 来学习。可惜的是,在执行 flann.knnMatch(des1,des2,k=2) 的时候出错了。以下是我的代码:

import cv2
import time
import numpy as np

im1 = cv2.imread('61_a.tif')
im2 = cv2.imread('61_b.tif')

surf = cv2.SURF(500,3,4,1,0) 
print "Detect and Compute"
kp1 = surf.detect(im1,None)
kp2 = surf.detect(im2,None)

des1 = surf.compute(im1,kp1)
des2 = surf.compute(im2,kp2)

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

flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)

我遇到了这个错误:

matches = matcher.knnMatch(des1,des2,k=2)
TypeError: Argument given by name ('k') and position (2)

我尝试按照这个 问题中的解决方案 来修改匹配方式,像这样:

flann = cv2.flann_Index(des2, index_params)
matches = flann.knnMatch(des1,2,params={})

但是我又遇到了这个错误:

flann = cv2.flann_Index(des2, index_params)
TypeError: features is not a numerical tuple

我真的不太确定我哪里做错了。有没有人能给我指个方向?

如果你知道有一个简单易懂的关于使用PYTHON进行全景拼接的SURF或ORB的例子,我也会很感激。我在网上搜索了很多,只找到了一些关于如何实现的片段(或者是用C语言写的),或者只找到了一些未完成或有问题的例子。

谢谢!

1 个回答

1

surf.compute() 这个函数会返回两个列表,一个是关键点列表,另一个是描述符列表。然后,flann.knnMatch() 这个函数会感到困惑,因为 des1 是一对列表,而不是简单的一个列表,所以它在寻找匹配时,发现了另一对列表(也就是 des2)。你可以检查一下 des1des2 的形状(shape)。

你可以把 des1[1]des2[1] 传给 flann.knnMatch(),或者用 surf.detectAndCompute() 来替代 surf.detect()surf.compute() 这两个函数。

撰写回答