8

I need to get the similarity score of two images, I'm using the SIFT Comparison, I've followed the tutorial Feature Matching but It's missing the score calculation. You'll find below the code That I used for the sift comparison :

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

and I also found a part of a code that calculates the score:

# 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;

but when I add it to the comparison code I get this error :

  percent=(a*100)/kp1
  TypeError: unsupported operand type(s) for /: 'int' and 'list

Thank you

L Y E S - C H I O U K H
  • 4,765
  • 8
  • 40
  • 57
newbie
  • 646
  • 8
  • 27

1 Answers1

9

I believe I found a solution for my problem, for those whom are facing the same trouble, you'll find below the code, I've tested and it seemed to work fine.

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

If you want to work with sift, you can just change the surf=cv2.xfeatures2d.SURF_create() to sift=cv2.xfeatures2d.SIFT_create() and kp, des = sift.detectAndCompute(img,None)

Thank you

newbie
  • 646
  • 8
  • 27