前回の予告通り、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が使用される
- BRIEF特徴量に回転を加えると、以下のデメリットが出てしまう
実践
流れはSIFT、SURF等と同じです。
画像としてはSIFTで使ったのと同じものを使います。
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)
- シールの点数の数字に特徴点が集中している、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)
- シールの点数数字に特徴点が集中するのはどれも同じ
- 追加の2画像では、台紙コーナーが4つすべて検出されています。
参考に、SIFTでの結果を再掲します。
これと比べるとだいぶ見やすいですね。
このあたりの違いは実アプリケーションでどのアルゴリズムを使うか、の判断の基準になりそうです。
今回はデフォルトのパラメータ設定にしましたが、この調整の余地もあるかも。
以上
アルゴリズムごとの違いを見ることができました。
次回は、チュートリアル通りに「特徴点のマッチング」をやりたいと思います。