python - OpenCV和Python:knnMatch参数问题

我正在尝试遵循opencv教程here。不幸的是,它在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)

我试图更改匹配以镜像fix in this question,如下所示:
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

我真的不确定自己在做什么错。有人可以指出我正确的方向吗?

如果您碰巧知道用于全景/拼接的SURF或ORB的PYTHON示例工作非常简单,我也将不胜感激。我在Google上搜索了很多,只发现了一些有关如何实现的操作(或用C编写),或者仅发现了未完成/残破的示例。

谢谢!

最佳答案

surf.compute()返回关键点和描述符列表。 flann.knnMatch()感到困惑,因为des1是一对列表,而不是k=1而是找到另一对列表(即des2)。检查des1和des2的shape()

可以将des1[1]des2[1]传递给flann.knnMatch(),也可以使用surf.detectAndCompute()代替surf.detect()surf.compute()

https://stackoverflow.com/questions/24293707/

相关文章:

opencv - 在cmake生成的项目中指定libstd

opencv - 使用眼睛位置作为引用裁剪检测到的面部

python - 如何将python list [a,b,c,d]转换为[a:b,c:d]格式

docker - 如何创建docker卷设备/主机路径

opencv - 如何使用 OpenCV 有选择地应用膨胀?

opencv - 如何在openCV中的图像上绘制不同的形状?

amazon-web-services - 将 s3fs 挂载为 docker 卷

python - OpenCV VideoCapture仅在5个read()之后更新

opencv - 如何使用opencv在鱼眼校正图像中绘制内接矩形?

spring-boot - IllegalStateException : Topic(s) [XY