我有两个图像,我想用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)
现在我如何将关键点与来自参考图像的另一组关键点进行比较?
有一个用于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)
| 归档时间: |
|
| 查看次数: |
5108 次 |
| 最近记录: |