我有一个512x512的图片,它提供了6109个SIFT关键点。
现在,我旋转它,然后得到6070个SIFT关键点。
我尝试了以下
import cv2
import numpy as np
np.set_printoptions(threshold=np.nan)
img = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp,des = sift.detectAndCompute(gray,None)
print('kp',len(kp))
print('des',des.shape)
for i in range(len(kp)):
print('x ',kp[i].pt[0])
print('y ',kp[i].pt[1])
print('size',kp[i].size)
print('response',kp[i].response)
print('descriptor',np.sort(des[i]))
print('\n')
将输出发送到文本文件。
现在,我对旋转的图像进行了相同的操作。
您必须已经注意到,在将128值描述符写入文件之前,我正在对其进行排序,以便在旋转时,如果描述符中值的顺序发生更改,则仍然存在匹配项。
我的结论是,在这12179个描述符(6070 + 6109)中,只有两个相同。休息至少相差一个数,通常我看到的相差很多。
您能建议一个将显示两个图像之间的对应关系的x,y坐标的python代码吗?
另外,在比较描述符时我在这里必须做一些根本上的错误。请指出。
谢谢
最佳答案
例如
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
匹配项将具有对应关系的索引以及这些对应关系之间的距离
您可以根据matchs.distance对该匹配进行排序
并使用matches.queryIdx和matches.trainIdx获取x和y坐标
您可以使用kp1 [matches [idx] .trainIdx]和kp2 [matches [idx] .queryIdx]获取x和y位置
关于python - 使用SIFT定位图像之间的对应关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50550211/