如何比较python opencv2.4中的冲浪功能

use*_*836 4 python opencv

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

我理解如何从本书的单个图像中提取冲浪特征:使用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()
Run Code Online (Sandbox Code Playgroud)

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

hjw*_*ide 6

有一个用于Python OpenCV的FLANN实现,我自己使用它并且它运行得很好.最初想弄清楚并不容易,但这个问题给了我很多帮助,请参阅Esteban Angee的回答.

您还可以查看我对这个问题的答案,我在那里快速解释了代码.我在这里重复一下解释.

r_threshold = 0.6
FLANN_INDEX_KDTREE = 1  # bug: flann enums are missing
Run Code Online (Sandbox Code Playgroud)

构造参数字典:

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4)
flann = cv2.flann_Index(desc2, flann_params)
Run Code Online (Sandbox Code Playgroud)

执行最近邻搜索:

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]) )
Run Code Online (Sandbox Code Playgroud)

返回匹配的描述符:

return pairs[mask]
Run Code Online (Sandbox Code Playgroud)