4

我有两个图像,我想使用 python 和 opencv 进行比较。

我从这本书中了解了如何从单个图像中提取冲浪特征:Programming Computer Vision with Python。

我提取的特征如下:

import cv2
from numpy import *

# read image
im = cv2.imread('empire.jpg')

# downsample
im_lowres = cv2.pyrDown(im)

# convert to grayscale
gray = cv2.cvtColor(im_lowres,cv2.COLOR_RGB2GRAY)

# detect feature points
s = cv2.SURF()
mask = uint8(ones(gray.shape))

keypoints = s.detect(gray,mask)

# show image and points
vis = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
for k in keypoints[::10]:
    cv2.circle(vis,(int(k.pt[0]),int(k.pt[1])),2,(0,255,0),-1)
    cv2.circle(vis,(int(k.pt[0]),int(k.pt[1])),int(k.size),(0,255,0),2)

cv2.imshow('local descriptors',vis)
cv2.waitKey()

现在我如何将关键点与来自参考图像的另一组关键点进行比较?

4

2 回答 2

6

Python OpenCV 有一个 FLANN 实现,我自己用过,效果很好。最初很难弄清楚,但这个问题对我帮助很大,请参阅Esteban Angee 的回答。

你也可以看看我对这个问题的回答,我在这里快速解释了代码。我在这里重复解释。

r_threshold = 0.6
FLANN_INDEX_KDTREE = 1  # bug: flann enums are missing

构建你的参数字典:

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4)
flann = cv2.flann_Index(desc2, flann_params)

执行最近邻搜索:

idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict
mask = dist[:,0] / dist[:,1] < r_threshold
idx1 = np.arange(len(desc1))
pairs = np.int32( zip(idx1, idx2[:,0]) )

返回匹配的描述符:

return pairs[mask]
于 2012-09-29T13:32:58.557 回答
1

匹配 SURF 描述符通常使用 k-最近邻(k=2)完成。当然,对于 C++,OpenCV 有一个内置类来执行此操作 - 快速近似最近邻描述符匹配器(FLANN_matcher),尽管我似乎找不到任何 Python 版本的文档。大概挖一下,看看能不能找到?

如果您最终需要从头开始执行此操作,这篇文章有一个很好的代码示例 using cv2.KNearest,这绝对是 Python 版本。

于 2012-09-27T13:48:21.660 回答