Python+OpenCVで特徴量記述・アルゴリズムまとめ

Python+OpenCVで画像の特徴点の特徴量を記述する.OpenCV2.4.9およびOpenCV3.0 alphaについて使用できるアルゴリズムをまとめる.

Python+OpenCVで特徴点抽出・使えるアルゴリズムまとめ OpenCV2.4.9と3.0 alpha - whoopsidaisies's diary
の続き.

環境

WindowsでOpenCV公式サイトのダウンロードページから2.4.9および3.0 alphaのビルド済みバイナリをダウンロードしてきて解凍したものを使う.

特徴量記述器の使い方

特徴点抽出のときのFeatureDetectorと同じように,特徴量記述についてもDescriptorExtractorという共通インターフェースが用意されている.

使い方は以下の通り.

# 引数でどの特徴量記述子を使うか指定 
extractor = cv2.DescriptorExtractor_create(extractor_name)
# 引数として画像と特徴点を渡す
# 戻り値は特徴点と特徴量
keypoints, descriptors = extractor.compute(img, keypoints)

DescriptorExtractor_createメソッドで指定出来る特徴量記述子を以下にまとめた.

OpenCVバージョン 実数ベクトル バイナリコード
2.4.9 SIFT, SURF BRIEF, BRISK, ORB, FREAK
3.0 alpha KAZE AKAZE, BRISK, ORB

(2.4.9でORBがなぜかランタイムエラーが出るので追々調査予定)

特徴量の中身

descriptorsの中身は2次元のarrayになっており,特徴点ごとに特徴量のベクトルが格納されている.

KAZEで記述した特徴量を表示してみるとこんな感じ(0番目の点).

>>descriptors[0]
array([ -7.38840317e-04,  -6.34267868e-04,   2.61819176e-03,
         3.50267510e-03,  -1.59906253e-04,  -4.56994586e-03,
         4.39605350e-03,   9.44076758e-03,  -1.75689301e-03,
         8.05667194e-04,   3.55383591e-03,   4.12554527e-03,
        -1.54193444e-03,   1.58668880e-03,   2.78847502e-03,
         3.14337271e-03,  -1.62520558e-02,   1.65848620e-02,
         3.65739577e-02,   2.07063138e-01,   2.64649391e-02,
        -6.13974873e-03,   9.64385048e-02,   2.91850477e-01,
         5.54781593e-02,   6.74537197e-03,   6.74520805e-02,
         8.45865980e-02,  -2.12559430e-03,   1.18403265e-03,
         5.09992335e-03,   4.04977519e-03,  -1.28035052e-02,
         6.93068025e-04,   3.93203236e-02,   4.54802722e-01,
        -2.96720478e-04,   6.83288351e-02,   8.15773308e-02,
         6.17026806e-01,  -1.08468741e-01,   5.95125668e-02,
         1.92962006e-01,   2.17324436e-01,  -1.21422755e-02,
         2.50244630e-03,   1.34693161e-02,   6.25377288e-03,
         2.55310140e-03,  -4.21544649e-02,   2.98030730e-02,
         1.50349155e-01,   4.27789390e-02,  -9.73087847e-02,
         1.63991615e-01,   1.90487400e-01,   3.39032081e-03,
        -2.32313443e-02,   1.98113456e-01,   6.58137947e-02,
        -1.16498368e-02,   2.66303378e-03,   1.25482017e-02,
         4.14769724e-03], dtype=float32)

グラフ表示だとこんな感じ.

import matplotlib.pyplot as plt
plt.plot(descriptors[0])

f:id:whoopsidaisies:20141201234637p:plain

KAZEは64次元の実数ベクトルで特徴量記述をするので以上のようになるが,記述子によってデータ量が違うため配列の長さや型が変わってくる.