Sift比较,计算相似度分数,Python。

8
我需要获取两个图像的相似度得分,我正在使用SIFT比较方法,我已经按照教程特征匹配所述进行了操作,但是缺少得分计算。 下面是我用于SIFT比较的代码:
import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('C:/Users/Akhou/Desktop/ALTRAN Tech.jpg',0)          # queryImage
img2 = cv2.imread('rect.png',0) # trainImage

# Initiate SIFT detector
sift=cv2.xfeatures2d.SIFT_create()

# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)   # or pass empty dictionary

flann = cv2.FlannBasedMatcher(index_params,search_params)

matches = flann.knnMatch(des1,des2,k=2)

# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]

# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
    if m.distance < 0.7*n.distance:
        matchesMask[i]=[1,0]

draw_params = dict(matchColor = (0,255,0),
                   singlePointColor = (255,0,0),
                   matchesMask = matchesMask,
                   flags = 0)

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)

plt.imshow(img3,),plt.show()

我也找到了一个计算分数的代码部分:

# Apply ratio test
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])
        a=len(good)
        print(a)
        percent=(a*100)/kp1
        print("{} % similarity".format(percent))
        if percent >= 75.00:
            print('Match Found')
            break;

但是当我将它添加到比较代码中时,我会收到以下错误提示:
  percent=(a*100)/kp1
  TypeError: unsupported operand type(s) for /: 'int' and 'list

谢谢你。

谢谢你


你正在将(a*100)除以kp1,其中kp1是一个列表而不是有效的数值。 - Nishant Nawarkhede
我明白了,谢谢你。我已经将它更改为percent=(a*100)/len(kp1),它可以工作,但我认为这没有意义! - newbie
1个回答

9

我相信我已经找到了解决我的问题的方法,对于那些遇到同样麻烦的人,下面是代码,我已经测试过了,看起来很好用。

import numpy as np
import cv2
from matplotlib import pyplot as plt
from tkinter.filedialog import askopenfilename

filename1 = askopenfilename(filetypes=[("image","*.png")]) # queryImage
filename2 = askopenfilename(filetypes=[("image","*.png")]) # trainImage

img1=cv2.imread(filename1,4)
img2=cv2.imread(filename2,4)

# Initiate SURF detector
surf=cv2.xfeatures2d.SURF_create()

# find the keypoints and descriptors with SURF
kp1, des1 = surf.detectAndCompute(img1,None)
kp2, des2 = surf.detectAndCompute(img2,None)

# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

# Apply ratio test
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])
        a=len(good)
        percent=(a*100)/len(kp2)
        print("{} % similarity".format(percent))
        if percent >= 75.00:
            print('Match Found')
        if percent < 75.00:
            print('Match not Found')

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
plt.imshow(img3),plt.show()

如果您想使用SIFT进行工作,只需将surf=cv2.xfeatures2d.SURF_create()更改为sift=cv2.xfeatures2d.SIFT_create(),并且 kp, des = sift.detectAndCompute(img,None)

谢谢


缩进有误,a=len(good)和下一行必须在循环后执行。 - Andrei Pop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接