勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

OpenCVやってみる-18. ORBによる特徴点検出、特徴量記述

前回の予告通り、ORBをやってみます。

OpenCV: ORB (Oriented FAST and Rotated BRIEF)

ORB (Oriented FAST and Rotated BRIEF) — OpenCV-Python Tutorials 1 documentation

ざっくり紹介、理論

  • SIFTやSURFは特許を取られていて自由に使えない
  • その代替としてOpenCV Labsで考案された
  • 基本的にはFASTによる特徴点検出と、BRIEFによる特徴量記述の組み合わせ、ただし以下の改良がある
    • FAST自体は回転を考慮しない、ORBでは特徴点の回転角を計算する
    • BRIEFでの特徴量は回転不変性を持たない、ORBでは上記で計算した回転角に合わせて特徴量を回転させる
      • BRIEF特徴量に回転を加えると、以下のデメリットが出てしまう
        • 各ビットの平均、分散が望ましい形(大きい分散、平均0.5)にならない
        • 各画素ペアの比較(binary test)結果に相関が生まれる
      • ORBでは可能なbinary testの組み合わせをすべて試して、最も良い性質を持つものを選択する(rBRIEF)
      • 特徴量の比較にはmulti-probe LSHが使用される

実践

流れはSIFT、SURF等と同じです。

画像としてはSIFTで使ったのと同じものを使います。

f:id:nokixa:20210706090007p:plain

ORBでもカラー画像の入力でいいよう。
まずは1つ目の画像だけで。

orb = cv2.ORB_create()
img1_kp = orb.detect(img1, None)
img1_kp, img1_des = orb.compute(img1, img1_kp)
img1_draw = cv2.drawKeypoints(img1, img1_kp, None, color=(0,255,0), flags=0)
cv2.imshow('Keypoints 1', img1_draw)

f:id:nokixa:20210817014250p:plain:w400

  • シールの点数の数字に特徴点が集中している、SIFTのときと比べると規則性は見える
  • 台紙のコーナーは1つしか特徴点とされていない…

残りの2画像でもやってみます。

img2_kp = orb.detect(img2, None)
img2_kp, img2_des = orb.compute(img2, img2_kp)
img2_draw = cv2.drawKeypoints(img2, img2_kp, None, color=(0,255,0), flags=0)
img3_kp = orb.detect(img3, None)
img3_draw = cv2.drawKeypoints(img3, img3_kp, None, color=(0,255,0), flags=0)

import numpy as np
img123_draw = np.hstack((img1_draw, img2_draw, img3_draw))
cv2.imshow('Keypoints 1-3', img123_draw)

f:id:nokixa:20210817014732p:plain

  • シールの点数数字に特徴点が集中するのはどれも同じ
  • 追加の2画像では、台紙コーナーが4つすべて検出されています。

参考に、SIFTでの結果を再掲します。

f:id:nokixa:20210713225333p:plain
SIFTでの結果

これと比べるとだいぶ見やすいですね。
このあたりの違いは実アプリケーションでどのアルゴリズムを使うか、の判断の基準になりそうです。

今回はデフォルトのパラメータ設定にしましたが、この調整の余地もあるかも。

以上

アルゴリズムごとの違いを見ることができました。

次回は、チュートリアル通りに「特徴点のマッチング」をやりたいと思います。