Pythonとopencv4で特徴量パターンマッチング(AKAZE)
いよいよパターンマッチングに着手。
まさにやりたいことを紹介してくれているサイトはあるが、やはりそのままでは動かない。OpenCV2 → 3 → 4 になるにつれて抜けてる機能があるのが原因かと。
cv2.drawMatchesKnn()
は使えないので注意!
準備
Pyhton-contribをインストールする。pipで以下のコマンドを実行。
pip install opencv-contrib-python
プログラム
# 21_BFMatcher_001.py # python 3.8.1 # opencv-contrib-python 4.2.0.32 # opencv-python 4.1.2.30 # coding: utf-8 # import cv2 import numpy as np #参照画像(img_ref)と比較画像(img_comp)の読み込み img_comp = cv2.imread("21_comp.jpg") img_ref = cv2.imread("21_ref.jpg") #グレースケース変換 gray_img_comp = cv2.cvtColor(img_comp, cv2.COLOR_BGR2GRAY) gray_img_ref = cv2.cvtColor(img_ref, cv2.COLOR_BGR2GRAY) #AKAZEの中で輪郭をぼかすフィルターが入っているので、前処理はしない #gray_img_comp = cv2.blur(img_comp, (3, 3)) #gray_img_ref = cv2.blur(img_ref, (3, 3)) #AKAZE検出器の生成 akaze = cv2.AKAZE_create() #特徴量の計算 kp1, des1 = akaze.detectAndCompute(gray_img_comp, None) kp2, des2 = akaze.detectAndCompute(gray_img_ref, None) #Brute-Force Matcher生成 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False) #bf = cv2.BFMatcher(cv2.NORM_L1, crossCheck=False) #bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=False) #特徴量ベクトル同士をBrute-Force&knnでマッチング matches = bf.knnMatch(des1, des2, k=2) #matches = sorted(matches, key = lambda x:x.distance) # データを間引きする ratio = 0.5 good = [] for m, n in matches: if m.distance < ratio * n.distance: good.append(m) #対応する特徴点同士を描画 img_result = cv2.drawMatches(img_comp, kp1, img_ref, kp2, good, None, flags=2) #画像表示 cv2.namedWindow("Result", cv2.WINDOW_NORMAL) cv2.imshow('Result', img_result) cv2.waitKey(0) cv2.destroyAllWindows()