OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
ORB (Oriented FAST and Rotated BRIEF)

目的

本章では、

  • ORB の基礎を学ぶ

理論

OpenCV の愛好家にとって、ORB について最も重要な点は、それが「OpenCV Labs」から生まれたということである。このアルゴリズムは、Ethan Rublee、Vincent Rabaud、Kurt Konolige、Gary R. Bradski によって2011年の論文 ORB: An efficient alternative to SIFT or SURF で提案された。タイトルが示す通り、計算コスト、マッチング性能、そして何よりも特許の面で、SIFT と SURF の良い代替手段である。そう、SIFT と SURF は特許で保護されており、使用にあたっては対価を支払う必要がある。しかし ORB はそうではない !!!

ORB は基本的に、FAST キーポイント検出器と BRIEF 記述子を融合させ、性能を高めるために多くの改良を加えたものである。まず FAST を使ってキーポイントを見つけ、次に Harris のコーナー尺度を適用してその中から上位 N 個の点を見つける。また、マルチスケールの特徴を生成するためにピラミッドも使用する。しかし1つ問題があり、FAST は方向を計算しない。では回転不変性はどうするのか? 著者たちは次のような改良を考え出した。

検出されたコーナーを中心としたパッチについて、強度で重み付けした重心を計算する。このコーナー点から重心へ向かうベクトルの方向が方向を与える。回転不変性を高めるために、モーメントは半径 \(r\) の円形領域内にあるべき x と y で計算される。ここで \(r\) はパッチのサイズである。

次に記述子についてだが、ORB は BRIEF 記述子を使用する。しかし BRIEF が回転に対して弱いことはすでに見た通りである。そこで ORB が行うのは、キーポイントの方向に応じて BRIEF を「操舵 (steer)」することである。位置 \((x_i, y_i)\) における \(n\) 個の二値テストからなる任意の特徴集合に対して、これらのピクセルの座標を含む \(2 \times n\) の行列 \(S\) を定義する。次にパッチの方向 \(\theta\) を使って回転行列を求め、\(S\) を回転させて操舵 (回転) されたバージョン \(S_\theta\) を得る。

ORB は角度を \(2 \pi /30\) (12度) 刻みに離散化し、あらかじめ計算した BRIEF パターンのルックアップテーブルを構築する。キーポイントの方向 \(\theta\) がビュー間で一貫している限り、その記述子の計算には正しい点の集合 \(S_\theta\) が使用される。

BRIEF には、各ビット特徴が大きな分散を持ち、平均が0.5付近になるという重要な性質がある。しかしいったんキーポイントの方向に沿って向きを揃えると、この性質を失い、より分散した状態になる。分散が大きいほど特徴はより識別力を持つ。なぜなら入力に対して差を持って応答するからである。もう1つの望ましい性質は、テスト同士が無相関であることである。そうすれば各テストが結果に寄与するからである。これらすべてを解決するため、ORB はあり得るすべての二値テストの中から、大きな分散と0.5に近い平均の両方を持ち、かつ無相関であるものを見つけるための貪欲探索を実行する。その結果は rBRIEF と呼ばれる。

記述子マッチングには、従来のLSHを改良したマルチプローブLSHを用いる。論文によれば、ORBはSURFやSIFTよりも非常に高速であり、ORB記述子はSURFより良好に動作する。ORBはパノラマスティッチングなどの用途で低消費電力デバイスに適した選択肢である。

OpenCVにおけるORB

通常どおり、関数 cv.ORB() もしくはfeature2dの共通インターフェースを用いてORBオブジェクトを生成する。多数の省略可能な引数を持つ。最も有用なものはnFeaturesで、これは保持する特徴の最大数を表す(デフォルトは500)。scoreTypeは特徴をランク付けするのにHarrisスコアとFASTスコアのどちらを使うかを表す(デフォルトはHarrisスコア)。別の引数WTA_Kは、oriented BRIEF記述子の各要素を生成するために用いる点の数を決定する。デフォルトは2、すなわち一度に2点を選択する。この場合、マッチングにはNORM_HAMMING距離が使われる。WTA_Kが3または4の場合は、BRIEF記述子の生成に3点または4点を使い、マッチング距離はNORM_HAMMING2で定義される。

以下はORBの使用法を示す簡単なコードである。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg', cv.IMREAD_GRAYSCALE)
# Initiate ORB detector
orb = cv.ORB_create()
# find the keypoints with ORB
kp = orb.detect(img,None)
# compute the descriptors with ORB
kp, des = orb.compute(img, kp)
# draw only keypoints location,not size and orientation
img2 = cv.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
plt.imshow(img2), plt.show()
void drawKeypoints(InputArray image, const std::vector< KeyPoint > &keypoints, InputOutputArray outImage, const Scalar &color=Scalar::all(-1), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT)
Draws keypoints.
Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
Loads an image from a file.

以下の結果を参照のこと。

image

ORBの特徴マッチングについては、別の章で扱う。

追加リソース

  1. Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571.