[OpenCV ルーチン 300 記事] 246. 特徴検出のための ORB アルゴリズム

「youcansの300 OpenCVルーチン - 総合カタログ」


[ユーキャンのOpenCVルーチン300記事] 246. 特徴検出のためのORBアルゴリズム


特徴の検出と照合は、検出、記述、照合という相互に関連する 3 つのステップを含む、コンピューター ビジョンの基本的なタスクです。ターゲット検出、画像検索、ビデオ追跡、三次元再構成などの多くの分野で広く使用されています。


6.9.1 ORB アルゴリズムの概要

ORB (Oriented FAST androtated BRIEF) は、OpenCV 研究所によって開発された特徴検出および特徴記述アルゴリズムです。FAST 特徴検出と BRIEF 特徴記述を組み合わせて改良しています。スケール不変性と回転不変性があり、ノイズに強いです。強力です。抗干渉能力。

ここに画像の説明を挿入します

ORB アルゴリズムは、FAST アルゴリズムを使用して画像ピラミッド内のキー ポイントを検出し、一次モーメントを通じてキー ポイントの方向を計算し、方向補正された BRIEF を使用して特徴記述子を生成します。

FAST (加速セグメント テストによる特徴) は、特徴抽出に使用されるキー ポイント検出アルゴリズムですが、特徴の説明は含まれません。 FASTアルゴリズムは、周囲の画素と比較して特徴点を特定するアルゴリズムであり、計算速度が速く、再現性が高く、リアルタイムの映像処理に最適です。

BRIEF (Binary Robust Independent Elementary features) は、キーポイントの特徴記述子としてバイナリ文字列を直接生成するバイナリ特徴記述子で、特徴記述子の作成を高速化し、特徴記述子のメモリ使用量を削減し、特徴量の効率を大幅に向上させます。マッチングは、高速かつ効率的な特徴記述方法であり、照明、ぼかし、および透視変換に対して非常に堅牢です。

基本的な FAST アルゴリズムと BRIEF アルゴリズムには、スケール不変性と回転不変性がありません。ORB アルゴリズムの主な貢献は次のとおりです:
(1) FAST アルゴリズムによって抽出された特徴点の場合、回転不変性を達成するために、一次モーメントによって特徴点の方向が計算されます。
(2) 方向を含む BRIEF 特徴点記述子を効率的に計算します。
(3) 特徴記述子ポイントのペアの BRIEF 相関を低減し、最近傍マッチングのパフォーマンスの向上につながります。

参考文献:Ethan Rublee、Vincent Rabaud、Kurt Konolige、Gary Bradski。 Orb: ふるい分けやサーフィンに代わる効率的な代替手段。 2011 年の IEEE 国際会議コンピュータ ビジョン (ICCV)、、2564 ~ 2571 ページ。 IEEE、2011 年。

スケールの不変性は ORB 論文では取り上げられていませんが、OpenCV アルゴリズムの画像ピラミッドを通じてスケールの不変性が実現されます。


ORB の主な手順は次のとおりです。

(1) スケール空間キーポイント検出

ダウンサンプリングを通じて画像ピラミッドを構築します。各レイヤーには画像が 1 つだけあります。s 番目のレイヤーのスケールは次のとおりです: σ s = σ 0 s \sigma_s=\sigma_0^s < /span> a>ps =p0s 、s 番目のレイヤーの画像サイズは次のとおりです。 S i z e = ( H / σ s , W / σ s ) Size=(H/\sigma_s, W/\sigma_s ) Size=(H/σs W/σs )
FAST を使用して画像ピラミッドの各レイヤーのキー ポイントを検出し、ハリス コーナー応答関数または FAST アルゴリズムを使用して、応答が最も強い N 個のポイントを選択します。各スケールでキーポイントを検出することにより、アルゴリズムは特定のスケール特性を持ちます。

(2) キーポイントの方向を決める

SIFT の方向アルゴリズムは非常に多くの計算を必要としますが、SURF の方向アルゴリズムは精度が低くなります。 ORB は重心法を使用して、キー ポイントの一意の主方向を決定します。
キー ポイントを中心およびスケール半径とする近傍で、強度重心法 (最初のモーメント) を使用してキー ポイントの方向を計算します。
( C x , C y ) = ( m 10 / m 00 , m 01 / m 00 ) θ = アークタン ( m 01 , m 10 ) (C_x, C_y) = (m_{10}/m_{00}, m_{ 01}/ m_{00}) \\ \theta = arctan(m_{01}, m_{10}) (Cx Cy )=(m10 /m00 メートル01 /m00 )=arcta n(m01 メートル10 )
各キー ポイントの方向を決定することで、回転の不変性が実現されます。

(3) rBRIEF (Rotation-Aware BRIEF) を使用して機能記述子を生成します。

BRIEF 記述子は方向の変化に非常に敏感であり、10 度を超える回転がある場合、マッチングのパフォーマンスは低下します。
ORB は角度を 2π/30 (12 度) に離散化し、BRIEF モード用のルックアップ テーブルを構築します。 rBRIEF は、キー ポイントの方向に従って BRIEF をガイドし、キー ポイントの方向に従ってサンプリング ウィンドウを角度だけ回転します。 θ \theta θ の後、特徴領域が構築され、rBRIEF 特徴記述子が生成されるため、回転不変性を持ちます。

(4) rBRIEF 特徴記述子の分散

BRIEF 記述子の各キー ポイント ペアは、分散が大きく (平均値は 0.5 に近い)、相関が小さいため、マッチング パフォーマンスの向上が容易になります。
ただし、rBRIEF を使用すると、特徴点ペアの分散が減少し、相関が増加し、識別可能性が低下します。
rBRIEF によって失われた分散を回復するために、ORB は可能なすべてのバイナリ テストの間で貪欲検索を実行し、分散が高く相関が弱い 2 進点のペアを見つけます。

ORB の利点は、非常に高速で、比較的優れたパフォーマンスを持ち、回転不変性と一定のスケール不変性があることです。 ORB アルゴリズムは特許制限がなく無料で使用できるため、広く使用されており、SIFT アルゴリズムや SURF アルゴリズムの置き換えとしてよく使用されます。

計算速度: ORB>>SURF>>SIFT (それぞれ 1 桁の差)
回転ロバスト性: SURF>ORB~SIFT (~ はほぼ同じを意味します)< /span> a> スケール堅牢性: SURF>SIFT>ORB (ORB のスケール変換は非常に弱い)
ファジー堅牢性: SURF>ORB~SIFT


6.9.2 OpenCVのORBクラス

OpenCV は豊富な特徴検出アルゴリズムを提供し、cv::Feature2D クラスを継承し、統一された定義とカプセル化を採用しています。

OpenCV は、ORB アルゴリズムを実装するための cv::ORB クラスを提供します。ORB クラスは、cv::Feature2D クラスを継承し、create static メソッドを通じて作成されます。

ORB クラスのコンストラクターは次のとおりです。

static Ptr<ORB> create(int nfeatures=500,float scaleFactor = 1.2f,int nlevels = 8,int edgeThreshold = 31,int firstLevel = 0,int WTA_K = 2,ORB::ScoreType scoreType = ORB::HARRIS_SCORE,int patchSize = 31,int fastThreshold = 20)

ORB クラスは cv::Feature2D 親クラスを継承します。Python 言語では、ORB クラスはインターフェイス関数 cv.ORB_create または cv.ORB.create を通じてインスタンス化され、ORB オブジェクトを作成します。キー ポイントはメンバー関数 orb.detect によって検出され、関数 orb.compute はキー ポイント記述子を計算し、関数 orb.detectAndCompute はキー ポイントを検出して記述子を生成します。

cv.ORB.create([, nfeatures=500, scaleFactor=1.2f, nlevels=8, edgeThreshold=31, firstLevel=0, WTA_K=2, scoreType=ORB::HARRIS_SCORE, patchSize=31, fastThreshold=20]) → retval
cv.ORB_create([, nfeatures=500, scaleFactor=1.2f, nlevels=8, edgeThreshold=31, firstLevel=0, WTA_K=2, scoreType=ORB::HARRIS_SCORE, patchSize=31, fastThreshold=20]) → retval
orb.detect(image[, mask]) → keypoints
orb.compute(image, keypoints[, descriptors=None]) → keypoints, descriptors
orb.detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) → keypoints, descriptors

パラメータの説明:

  • nfeatures: キーポイントの最大数。デフォルト値は 500 です。
  • scaleFactor: 画像ピラミッドのスケーリング比。1 より大きい浮動小数点数。デフォルト値は 1.2 です。
  • nlevels: 画像ピラミッドのレベル数。デフォルト値は 8 です。
  • EdgeThreshold: 境界線はサイズを維持し、境界線に近いピクセルは検出しません。デフォルト値は 31 です。
  • firstLevel: 元の画像がピラミッドのどの層として使用されるか。デフォルト値は 0 です。
  • WTA_K: BRIEF 記述子ポイント ペアの構築に使用されるピクセル数。オプションの値は 2/3/4、デフォルト値は 2 です。
  • スコアタイプ: 応答の並べ替え方法。デフォルトは HARRIS_SCORE で、ハリス応答関数による並べ替えを意味します。
  • patchSize: 方向記述子を生成する機能領域のサイズデフォルト値は 31 です。
  • fastThreshold: FAST しきい値、デフォルト値は 20 です。
  • 画像: 入​​力画像、単一チャンネル。
  • マスク: マスク画像。キーポイントを検索する領域を指定します。オプション。
  • keypoints: 検出されたキーポイント、タプル。
  • descriptors: キーポイントの記述子、(nfeatures,32) の形式の Numpy 配列。

予防:

  • インターフェイス関数 cv.ORB.create または cv.ORB_create を使用して ORB クラスをインスタンス化する場合、OpenCV の異なるバージョンではいず​​れかの方法しか許可されない場合があります。
  • detect、compute、detectAndCompute などの関数は、Feature2D クラスから継承されたメンバー関数であり、プログラム内の形式は orb.detect で、orb は ORB クラスのインスタンス オブジェクトを表します。
  • キー ポイント記述子の形状は (nfeatures,32) で、nfeatures はキー ポイントの数、記述子のバイト長は 32 で、バイナリ エンコーディング長 256 に対応します。

ルーチン 14.28: 特徴検出のための ORB アルゴリズム

# 【例程 14.28】特征检测之 ORB 算法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    img = cv.imread("../images/Fig1701.png", flags=1)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    print("shape of image: ", gray.shape)

    # Initiate ORB detector
    orb = cv.ORB_create()  # 实例化 ORB 类
    # kp, descriptors = orb.detectAndCompute(gray)  # 检测关键点和生成描述符
    kp = orb.detect(img, None)  # 关键点检测,kp 为元组
    kp, des = orb.compute(img, kp)  # 生成描述符
    print("Num of keypoints: ", len(kp))  # 500
    print("Shape of kp descriptors: ", des.shape)  # (500,32)
    imgS = cv.convertScaleAbs(img, alpha=0.5, beta=128)
    imgKp1 = cv.drawKeypoints(imgS, kp, None)  # 只绘制关键点位置
    imgKp2 = cv.drawKeypoints(imgS, kp, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)  # 绘制关键点大小和方向
    plt.figure(figsize=(9, 3.5))
    plt.subplot(131), plt.title("1. Original")
    plt.axis('off'), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(132), plt.title("2. ORB keypoints")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgKp1, cv.COLOR_BGR2RGB))
    plt.subplot(133), plt.title("3. ORB keypoints scaled")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgKp2, cv.COLOR_BGR2RGB))
    plt.tight_layout()
plt.show()


ここに画像の説明を挿入します


プログラムの説明
プログラムの実行結果は図のとおりです。
⑴ サブピクチャ 1 は元の画像、サブピクチャ 2 とサブピクチャ 3 は元の画像上に ORB 検出のキー ポイントを描画します。部分図 2 はキー ポイントの中心のみを描画し、部分図 3 は各キー ポイントのキー ポイントのサイズと方向を表す円を描画します。
⑵ ルーチンは 500 個のキー ポイントを検出しましたが、サブ図 2 に示されているキー ポイントの数は多くないようです。図 3 を比較すると、キー ポイントとその隣接ポイントがさまざまなスケールで多数のキー ポイントとして検出される可能性があり、ORB アルゴリズムはこれを抑制しないことがわかります。



参考文献:Ethan Rublee、Vincent Rabaud、Kurt Konolige、Gary Bradski。 Orb: ふるい分けやサーフィンに代わる効率的な代替手段。 2011 年の IEEE 国際会議コンピュータ ビジョン (ICCV)、、2564 ~ 2571 ページ。 IEEE、2011 年

【この項の終わり】

著作権に関する声明:
Youcans@xupt のオリジナル作品、再版にはオリジナルのリンクを付ける必要があります: (https://blog.csdn.net/youcans/article/details/128033070) ) 作成日:2022-11-25
Copyright 2022 youcans, XUPT

おすすめ

転載: blog.csdn.net/youcans/article/details/128033070