Python独習!

習得したPython知識をペイフォワード

Pythonとopencv4で特徴量パターンマッチング(AKAZE)

いよいよパターンマッチングに着手。
まさにやりたいことを紹介してくれているサイトはあるが、やはりそのままでは動かない。OpenCV2 → 3 → 4 になるにつれて抜けてる機能があるのが原因かと。
cv2.drawMatchesKnn()は使えないので注意!

準備

Pyhton-contribをインストールする。pipで以下のコマンドを実行。

pip install opencv-contrib-python

AttributeError: 'module' object has no attribute 'bgsegm' · Issue #42 · bendidi/Tracking-with-darkflow · GitHub

結果

狙い通りに特徴点を拾うことができた。画像はダビンチコードの表紙。
左はネットから探してきた画像、右は現物をスマホで撮影して台形補正をした画像。
f:id:greenhornprofessional:20200403004049p:plain

マッチング部分を拡大
f:id:greenhornprofessional:20200403004105p:plain

プログラム

# 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()
/* -----codeの行番号----- */