我有一个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代码吗?
另外,在比较描述符时我在这里必须做一些根本上的错误。请指出。
谢谢

最佳答案

  • 为什么要对描述符排序? 128维描述符是描述要素关键点的名称(顾名思义)。通过排序,您实质上失去了对关键点/功能的描述。
  • 搜索相同的描述符不是找到对应关系的好方法。您必须找到具有最小欧几里得距离(或其他距离度量)的描述符,以获取对应关系。在opencv中有很多算法可以实现,例如蛮力匹配或基于knn的匹配器或基于flann的匹配器。您必须将描述符作为这些匹配器的输入(不要通过排序或其他操作来修改除草器的值)
    例如
    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/

    10-16 10:57