【Python】OpenCVで特徴量マッチング - ORB, SIFT, FLANN
OpenCVを使ったPythonでの画像処理について、画像認識について扱っていきましょう。 これまでに、静止画から物体を認識をする方法としてテンプレートマッチングという手法をすでに扱いました。 これは、静止画像の一部分をテンプレート画像として利用し、それに一致する部分を静止画像から検出するのものでした。この手法は同じ画像を材料にしている為に、柔軟性のある方法ではありませんでした。 そこで、ここでは二枚目の画像中の特徴点の特徴量に基づいてマッチングする方法(特徴点マッチング、特徴量マッチング)を見て行こうと思います。 まず、マッチングさせる2つの画像をjupyter notebookで読み込んで行きます。 ライブラリのインポートから始めましょう。 import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline OpenCV、NumPy、Matplotlibをインポートしています。これはいつもの通りです。 画像の表示を関数としてまとめておきます。 def display(img,cmap='gray'): fig = plt.figure(figsize=(12,10)) ax = fig.add_subplot(111) ax.imshow(img,cmap='gray') display()関数を定義し、画像をわたし、グレースケールで表示するようにします。figure()で表示サイズを指定して、add_subplot()で画像を配置し、imshow()で表示します。 hacker = cv2.imread('images/book.jpg',0) imread()で画像を読み込みます。こちらは、まず1つ目の画像です。 先ほど定義した関数に渡して、画像を表示します。 ポール・グレアムの有名な本の表示の画像をここでは用意してみました。 もう一つ画像を用意します。 items = cv2.imread('images/books.jpg',0) display(items) こちらもグレースケールで読み込んで表示します。 複数の本を適当に並べた画像を用意しました。この中に、先ほど表示したポール・グレアムの本も含まれていることを確認してください。 このナチュラルに並べた物体の中から、目的の画像を検出するのがここで行う特徴量マッチングです。テンプレートマッチングで使用した画像との違いですね。 まず、総当たりマッチング(Brute-Force matcher)を扱ってみます。 総当たりマッチングは、一つ目の画像の中のある特徴点の特徴量記述子を計算し、もう一つの画像の中にある全特徴点の特徴量から、ある距離計算に基づいてマッチングを行います。最も距離が小さい特徴点が対応する部分がマッチング結果として得られます。 次のようなコードになります。 orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(hacker,None) kp2, des2 = orb.detectAndCompute(items,None) bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1,des2) matches = sorted(matches, key = lambda x:x.distance) hacker_matches = cv2.drawMatches(hacker,kp1,items,kp2,matches[:25],None,flags=2) まず、cv2.ORB_create()でORB抽出器を初期化します。 これを使って画像のキーポイントと記述子を見つけていきます。detectAndCompute()の第1引数は特徴点を抽出する画像、第2引数は特徴点を抽出する領域を選択するマスクを指定しますが、ここではNoneを指定し画像全体から特徴点を抽出します。2つの画像の特徴的な点の位置(kp1, kp2)、特徴を現すベクトル(des1, des2)をそれぞれ返します。 特徴点を全て比較するBFMatcher()をオブジェクト化します。 マッチングの計算に使う距離計算方法を1つ目のパラメータに指定します。デフォルトは cv2.NORM_L2 となっていて、SIFTやSURFといった特徴量記述子に向いています(cv2.NORM_L1 も同様)が、ここではORB(特徴ベクトルの各要素が2値となる特徴量記述子:ORB, BRIEF ...
https://code-graffiti.com/opencv-feature-matching-in-python/#toc3