hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

特徴点で一致具合を見る

◉ 特徴抽出

テンプレートマッチングは比較的簡単に使えるが、

画像の大きさが違っていたり、変形していたりすると、認識記されにくくなる。

そこで、2つの画像の特徴(輪郭、色、形、線の位置関係や方向など)に注目し、

同じようになっている部分を見つける方法。

 

◉ 画像を2つ使うように変更

まずは検索対象画像と、検索対象が含まれるかどうかを見つけるテンプレート画像を指定。

実行時に渡された画像ファイルが1つはあるかを判断している部分を、

2つあるかどうかを判断するよう、以下のように変更する。

 

  if len (sys.arvg < 3:

             print('特徴量検出するファイルを2つ指定ください。')

             sys.exit()

 

◉ 2つの画像ファイル名を受け取る

  file1 = sys.argv[1]

        file2 = sys.argv[2]

 

◉ 2つの画像を読み込む

  img1 = cv2.imread(file1)

        img2 = cv2.imread(file2)

        if (img1 is None) or (img2 is None):

              raise ValueError('特徴量検出ファイルが見つかりません。')

 

◉ AKAZEという方法で特徴を計算し、画像の特徴点を抽出する。

  detector = cv2.AKAZE_create()

        point1, desc1 = detector.detectAndCompute(img1, None)

        point2, desc2 = detector.detectAndComputer(img2, None)

 

◉ お互いの特徴点を使って両方向からマッチングさせる。

    matcher = cv2.BFMatcher(cv2.NORM_HAMMING, True)

       matches = matcher.match(desc1, desc2)

       img_match = cv2.drawMatches(img1, point1, img2, point2,matches, None, flags=2)

 

◉マッチング結果を表示

 cv2.imshow(file1 + '<-->' + file2, img_match)

 

 

 

f:id:hiyoko-programing:20200603013135p:plain

マッチングさせてみると、

画像と画像に線で特徴点が結ばれ、

線が密集しているほど似ているとも言える。