我想用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()
现在我如何将关键点与来自参考图像的另一组关键点进行比较?
答案 0 :(得分:6)
Python OpenCV有一个FLANN实现,我自己使用它并且它运行得很好。最初要弄清楚并不容易,但this question给了我很多帮助,请参阅Esteban Angee's回答。
您还可以查看我对this question的回答,我快速解释了代码。我在这里重复一下解释。
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]
答案 1 :(得分:1)
匹配SURF描述符通常使用k-最近邻居(k = 2)完成。当然对于C ++,OpenCV有一个内置类来做这个 - 快速近似最近邻居描述符匹配器(FLANN_matcher),虽然我似乎找不到任何Python版本的文档。也许有一个挖掘,看看你能找到它吗?
如果您最终需要从头开始执行此操作,this post使用cv2.KNearest
有一个很好的代码示例,它绝对是Python版本。