pythoncomparisonsift

Sift comparison, calculate similarity score, python


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


Solution

  • 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