MLのSIFT_FLANN:画像に対してSIFT特徴を抽出し、FLANN法により画像の類似度を判別して可視化する

2351 ワード

MLのSIFT_FLANN:画像に対してSIFT特徴を抽出し、FLANN法により画像の類似度を判別して可視化する
 
目次
FLANNアルゴリズム
1、索引の作成
2、検索を行う
出力結果
インプリメンテーションコード
 
FLANNアルゴリズム
FLANNライブラリのフルネームはFast Library for Approximate Nearest Neighborsで、現在最も完全な(近似)最近隣接するオープンソースライブラリです.一連の検索アルゴリズムを実現しただけでなく,最も速いアルゴリズムを自動的に選択するメカニズムも含まれている.flannの検索を使用すると、全体的に2つのステップに分けられます.1つはインデックスの作成、2つは検索です.
  • SIFTフィーチャーを使用してキーを抽出します.
  • SIFT特徴記述子を計算する.
  • FLANN整合器を使用してサブベクトル整合を記述する.

  •  
    1、索引の作成
    実は2つのパラメータが必要です.1つはデータ、すなわちmatマトリクス、2つはいくつかの具体的なパラメータです.このパラメータは、作成されたインデックスタイプに基づいて設定されます.どのようなインデックスタイプがありますか?共有:リニアインデックス、KD-Treeインデックス、K平均インデックス、複合インデックス、LSHメソッドインデックス、自動インデックスの6種類.
     
    2、検索を行う
    2つの検索方式がある:knnSearch//検索k隣接、radiusSearch//検索半径最近戻り結果から両者の違いを考慮すると、knnSearchは最も近い隣接点を返す(具体的な点の個数はユーザーが設定し、n個を設定すると必ずn個を返す);radiusSearchは、検索半径内のすべての点を返します(条件に合致する点が存在しない場合は空を返します).
     
    出力結果
     
    インプリメンテーションコード
    MLのSIFT:画像に対してSIFT特徴を抽出し、FLANN法により画像の類似度を判別して可視化する
        sift = cv2.xfeatures2d.SIFT_create()   
        #          
        kp1, des1 = sift.detectAndCompute(img1, None)
        kp2, des2 = sift.detectAndCompute(img2, None)
        print(len(kp1), len(des1) )   # 1402, 1402
    
    
        FLANN_INDEX_KDTREE = 0
        indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
        searchParams = dict(checks=50)
        flann = cv2.FlannBasedMatcher(indexParams, searchParams)
        #     
        matches = flann.knnMatch(des1, des2, k=2)
        #              
        matchesMask = [[0, 0] for i in range(len(matches))]
         
        for i, (m, n) in enumerate(matches):
            if m.distance < 0.7*n.distance:
                matchesMask[i] = [1, 0]
         
        drawPrams = dict(matchColor=(0, 255, 0),
                         singlePointColor=(255, 0, 0),
                         matchesMask=matchesMask,
                         flags=0)
        img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **drawPrams)
        img_PutText = cv2.putText(img3, "SIFT+kNNMatch: Image Similarity Comparisonn", (40, 40),cv2.FONT_HERSHEY_COMPLEX, 1.5, (0, 0, 255), 3,)
        img4 = cv2.resize(img_PutText, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)  #  1/2
         
        cv2.imshow("matches", img4)
        cv2.waitKey(7000)
        cv2.destroyAllWindows()