2015-04-22 5 views
4

J'ai plusieurs images de poissons dans ma base de données, Mon objectif est de trouver le score de similarité entre l'utilisateur entrée poisson image et images dans la base de données. Pour cela j'utilise opencv Feature matching + Homograpy à partir de ce lien.Opencv Python - Score de similarité de Caractéristique jumelée + Homograpy

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html#feature-homography

Mon code actuel est comme suit.

query_image = '/home/zealous/Pictures/train_images/AbudefdufWhitleyiJER.jpg' 
trained_image_folder = '/home/zealous/Pictures/train_images' 

Mon code actuel est le suivant.

def feature_matcher(query_image, image_folder): 

    min_match_count = 10 

    img1 = cv2.imread(query_image, 0) 
    surf = cv2.xfeatures2d.SURF_create(800) 
    kp1, des1 = surf.detectAndCompute(img1, None) 

    bf = cv2.BFMatcher(cv2.NORM_L2) 

    all_files = next(os.walk(image_folder))[2] 

    for file_name_temp in all_files: 
     try: 
      train_image = image_folder + '/' + file_name_temp 
      img2 = cv2.imread(train_image, 0) 
      surf = cv2.xfeatures2d.SURF_create(800) 
      kp2, des2 = surf.detectAndCompute(img2, None) 

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

      good = [] 
      for m, n in matches: 
       if m.distance < 0.7*n.distance: 
        good.append(m) 

      if len(good) > min_match_count: 

       src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2) 
       dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2) 

       M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) 

       matchesMask = mask.ravel().tolist() 

       h, w = img1.shape 
       pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1,1,2) 
       dst = cv2.perspectiveTransform(pts, M) 

       if not M==None: 
        print "\n" 
        print "-"*2, file_name_temp 
        print "number of good matches", len(good) 
        print "*"*10, matchesMask 

Je reçois assez bonne sortie que je suppose en voyant nombre de bons matches et variables matchesMask (qui contient des 0 et des 1). Si la base de données contient la même image que l'image d'entrée alors il y aura beaucoup de bonnes correspondances et tous les éléments de matchMask seront 1.

Ma question est de savoir comment calculer le score de similarité basé sur ce? devrais-je supposer que plus le nombre de 1 (Inliers) est là dans matchesMask, plus les deux images sont semblables ou dois-je prendre ratio entre le nombre de 1 (inliers) et 0 (outliers) et calculer la similarité basée sur cela.

Je sais que cela a été discuté dans de nombreuses questions, mais toutes les suggestions et les réponses sont dans le langage C++, donc je ne peux pas comprendre .. solution

Répondre

1

Dans un score de similarité vous ne voulez pas inclure les valeurs aberrantes - ils sont aberrants parce qu'ils n'aident pas avec vos données. Il suffit de prendre le nombre de 1 (inliers) comme score de similarité - vous devriez obtenir des résultats décents.