筛选比较,计算相似度得分,python

时间:2018-05-07 15:10:56

标签: python comparison sift

我需要得到两张图片的相似度得分,我正在使用SIFT比较,我已经按照教程Feature Matching但是它缺少得分计算。 你会在下面找到我用于筛选比较的代码:

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

谢谢

1 个答案:

答案 0 :(得分:0)

我相信我找到了解决问题的方法,对于那些面临同样问题的人,你会在代码下面找到,我已经测试过,它似乎工作正常。

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()

如果您想使用筛选,只需将surf=cv2.xfeatures2d.SURF_create()更改为sift=cv2.xfeatures2d.SIFT_create()kp, des = sift.detectAndCompute(img,None)

谢谢