特徴点で一致具合を見る
◉ 特徴抽出
テンプレートマッチングは比較的簡単に使えるが、
画像の大きさが違っていたり、変形していたりすると、認識記されにくくなる。
そこで、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)
マッチングさせてみると、
画像と画像に線で特徴点が結ばれ、
線が密集しているほど似ているとも言える。