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