FAST 機能と BRIEF 記述子に基づく opencv 高度な 16-ORB (イメージ マッチング)

コンピューター ビジョンでは、画像から特徴を抽出して照合する機能は、物体認識、画像のスティッチング、カメラの位置特定などのタスクにとって重要です。これを実現する一般的なアプローチは、
ORB (Oriented FAST and Rotated Brief) 特徴検出器と記述子です。Ethan Rublee らが開発した ORB は
、FAST (Accelerated Segmentation Testing features) と Brief (Binary Robust Independent Basic features) という 2 つの既存テクノロジーの長所を組み合わせて、特徴抽出とマッチングのための強力かつ効率的な方法を提供します。

この記事では、ORB の内部の仕組みを詳しく掘り下げ、ORB が特徴検出器および記述子としてどのように機能するか、その主要なコンポーネント、および他の特徴抽出方法と比較した ORB の利点について説明します。

  1. F AST 特徴検出器:

高速セグメント テスト (FAST) アルゴリズムによる特徴は、
16 ピクセルの円形近傍を分析することによって実装されます。FAST アルゴリズムは、近傍の各ピクセルを、円の中心を基準にして定義された特定のしきい値よりも明るいか暗いかとしてマークします。明るいまたは暗いとマークされた一連の連続したピクセルが含まれている場合、その近傍はコーナーとみなされます。

FAST は、画像内のコーナーやキーポイントを効果的に識別できるコーナー検出アルゴリズムです。シンプルな強度しきい値スキームと最小化計算を利用することで、従来のコーナー検出器よりも高速になるように設計されています。FAST は、候補ピクセルの周囲のピクセルの円を検査し、候補ピクセルよりも明るいまたは暗い連続ピクセルが十分な数ある場合、その円をコーナーとして分類します。

  1. 簡単な

さらに、Binary Robust Independent Elementary Feature
(BRIEF) は特徴検出アルゴリズムではなく、記述子です。記述子の概念をもう少し深く掘り下げてから、「BRIEF」に進みましょう。

SIFT と SURF を使用して画像を分析する場合、プロセス全体の中心となるのは、
detectAndCompute 関数を呼び出すことです。この関数は、検出と計算という 2 つの異なるステップを実行し、2 つの異なる結果 (タプルに結合) を返します。

検出結果はキーポイントのセットであり、計算結果はそれらのキーポイントの記述子のセットです。これは、OpenCV の cv2.SIFT クラスと cv2.SURF クラスの両方が検出アルゴリズムと記述アルゴリズムを実装していることを意味します。オリジナルの SIFT と SURF は特徴検出アルゴリズムではないことに注意してください。

OpenCV の cv2.SIFT は DoG 特徴検出と SIFT 記述を実装し、OpenCV の cv2.SURF は高速ヘシアン特徴検出と SURF 記述を実装します。
キーポイント記述子は画像の表現であり、
2 つの画像のキーポイント記述子を比較して共通点を見つけることができるため、特徴照合のチャネルとして機能します。BRIEF は現在、最も高速な記述子の 1 つです。BRIEF の背後にある理論はかなり複雑ですが、BRIEF は一連の最適化を採用しているため、特徴マッチングに非常に適していると言えます。

ブルートフォースマッチング

ブルート フォース マッチャーは、2 セットのキーポイント記述子を比較し、一致のリストを生成する記述子マッチャーです。このアルゴリズムには最適化がほとんど含まれないため、これはブルート フォース マッチングと呼ばれます。最初のセットのキーポイント記述子ごとに、マッチャーはそれを 2 番目のセットのすべてのキーポイント記述子と比較します。各比較により距離値が生成され、最小距離に基づいて最適な一致が選択されます。

大まかに言えば、コンピューティングにおける「ブルート フォース」という用語は、可能なすべての組み合わせ (たとえば、既知の長さのパスワードを解読するための文字の可能なすべての組み合わせ) を徹底的に列挙し、優先順位を付ける方法を指します。逆に、速度を優先するアルゴリズムは可能性を無視し、最も妥当な解決策を見つけるために近道を試みる可能性があります。

OpenCV は、ブルート フォース機能マッチングのいくつかの方法をサポートする cv2.BFMatcher クラスを提供します。

  1. ORB アルゴリズムの原理
    ORB アルゴリズムは、FAST 特徴点検出手法と BRIEF 特徴記述子を組み合わせ、それらをベースに改良および最適化を行います。

まず、FAST 特徴点検出法を使用して特徴点を検出し、次にハリス コーナー点測定法を使用して、FAST 特徴点の中からハリス コーナー点応答値が最大の N 個の特徴点を選択します。ハリス コーナーの応答関数は次のように定義されます。

R=detM−k(トレース(M))2

今日の生活では、さまざまな距離、さまざまな方向、角度、さまざまな照明条件から物体を観察すると、物体の大きさ、形、明るさが異なります。しかし、それでもそれが物体であることはわかります。理想的な特徴記述子はこれらの特性を備えている必要があります。つまり、サイズ、方向、色合いが異なる画像において、同じ特徴点は十分に類似した記述子を持つ必要があり、これを記述子の再現性と呼びます。

ただし、ORB はスケールの不一致の問題を解決しません。OpenCV の ORB 実装では、この領域のパフォーマンスを向上させるためにイメージ ピラミッドが使用されます。ガウス ピラミッドを構築し、ピラミッド イメージの各層のコーナー ポイントを検出して、スケールの不一致を実現します。ORB は主に、BRIEF 記述子が回転不変性を持たないという問題を解決します。ORB 論文では、この問題を解決するためのグレースケール重心法を提案しています。グレースケール重心法は、コーナー点のグレースケールと重心の間にオフセットがあることを前提としています。ベクトルを使用して方向を表すことができます。任意の特徴点 p について、p の隣接ピクセルのモーメントを次のように定義します。

ここに画像の説明を挿入

ここで、I(x,y) は点 (x,y) のグレー値、q は重心、i,j=0,1 です。次に、画像の重心を次のように取得できます。

ここに画像の説明を挿入

次に、特徴点と重心の間の角度が FAST 特徴点の方向として定義されます。

ここに画像の説明を挿入
アルゴリズムの回転不変性を改善するには、x と y が半径 r の円形領域内にあること、つまり x,y∈[−r,r] (r は半径に等しい) 内にあることを保証する必要があります。近所の。

特徴点の説明

ORB は機能記述方法として BRIEF を選択しましたが、BRIEF には回転不変性がないことがわかっているため、BRIEF に回転不変性を追加し、このメソッドを「Steer BRIEF」と呼ぶ必要があります。どの特徴点についても、その BRIEF 記述子は長さ n のバイナリ コード文字列です。このバイナリ コード文字列は、特徴点の近傍にある n 個の点ペアによって生成されます。ここでは、これら 2n 個の点 (xi,yi) について説明します。 i=1,2,...,2n は行列 S を形成します。

ここに画像の説明を挿入
Calonder は、各ブロックの回転と投影のセットに対して BRIEF 記述子を個別に計算することを提案しましたが、コストがかかります。ORB ではより効率的な方法が採用されています。近傍方向 θ と対応する回転行列 Rθ を使用して、S の修正バージョン Sθ が構築されます。

ここに画像の説明を挿入
で:

ここに画像の説明を挿入
θ は、特徴点に対して取得した主な方向です。

つまり、次の図に示すように、座標軸 ]theta を回転し、主方向を座標系として一致する点のペアを計算します。

ここに画像の説明を挿入
実際、角度を離散化することができます。つまり、360 度を 30 度ずつ 12 の部分に分割し、12 の角度それぞれの Sθ を取得して、ルックアップ テーブルを作成します。各 θ については、テーブルを検索するだけで、その点のセット Sθ をすばやく取得できます。

記述子の微分を解く

BRIEF の驚くべき特性の 1 つは、n 次元のバイナリ文字列の各特徴ビットについて、そのビットのすべての特徴点の値が、0.5 に近い平均値と大きな分散を持つガウス分布を満たすことです。分散が大きいほど識別力が強くなり、異なる特徴点の記述子間の差異が大きくなるため、マッチングのための不一致が発生しにくくなります。しかし、特徴点の方向に沿って BRIEF を Steered BRIEF に調整すると、平均はより分散したパターンにシフトします。方向性コーナー キー ポイントは、バイナリ文字列に対してよりバランスのとれたパフォーマンスを示していることが理解できます。さらに、各固有ベクトルの PCA 解析により、Steered BRIEF の分散が小さく、識別能が小さく、各成分間の相関が比較的大きいことが知られていることが論文中で述べられています。

Steered BRIEF 分散の損失を減らし、バイナリ コード文字列間の相関を減らすために、ORB は学習方法を使用して、より小さいポイント ペアのセットを選択します。以下のような方法:

まず、PASCAL2006 セットの画像から約 300k キーポイントのテスト セットが確立されます。

これらの 300k キー ポイントの各特徴点について、その 31×31 近傍を考慮します。この近傍でいくつかの点ペアが見つかります。これは、最初にこのパッチ内の点を平滑化するブリーフとは異なり、次に点ペアを選択する方法です。パッチ中心を原点とするガウス分布を使用します。

一部のノイズ ポイントの干渉を除去するために、ORB は 5×5 領域の平均グレー レベルを選択して、単一点のグレー レベルを置き換えます。ここで、5×5 領域の画像の平均グレー レベルは次のようになります。積分画像法を使用して計算されます。31×31 パッチにはそのようなウィンドウが N=(31−5+1)×(31−5+1) 個あることがわかっているため、N 個のサブウィンドウから 2 つのサブウィンドウを選択したい場合、次のようになります。 C2N メソッドの合計。したがって、300k の各特徴点について、その 31×31 の近傍から非常に長いバイナリ文字列を抽出できます。その長さは M=C2N で、次のように表されます。

ここに画像の説明を挿入
次に、上記の特徴から 300k のキー ポイントをすべて抽出すると、300k×M の行列が得られ、行列内の各要素の値は 0 または 1 になります。

行列の各列ベクトルの平均、つまり 300k 特徴点の各点ペアのテスト結果を計算します。すべての列ベクトルを平均値で並べ替えます。配置された後、ベクトル T が形成され、T の各要素は列ベクトルになります。貪欲検索を実行し、T の最初の列を R に入れます。T のこの点のペアのテスト結果はありません。次に、T の次の列と R のすべての要素を比較し、相関関係がある場合はそれらの相関関係を計算します。事前に設定されたしきい値を超えた場合は破棄し、それ以外の場合は R に入れます。

R に 256 個の列ベクトル位置ができるまで、上記の手順を繰り返します。

すべての T を検索しても 256 が見つからない場合は、関連するしきい値を増やして再試行できます。このようにして、256 点のペアが得られます。上記のプロセスを rBRIEF と呼びます。

OpenCVの実装

ORB で設定できるパラメータは多数あり、OpenCV では ORB を通じて ORB 検出器を作成できます。

cv2.ORB_create([,nfeatures[,scaleFactor[,nlevels[,edgeThreshold[,firstLevel[,WTA_K[,[scoreType,[patchSize,fastThreshold]]]]]]]])

パラメータの説明:

  • nfeatures: 抽出された特徴点の最大数。
  • scaleFactor: SIFT の k に似た、ピラミッド イメージ間のスケール パラメーター。
  • nlevels: ガウス ピラミッドの層の数。
  • edgeThreshold : エッジのしきい値。この値は主に後の patchSize に従って決定されます。エッジのedgeThreshold に近いピクセルは検出された特徴点ではありません。
  • firstLevel-: SIFT を見た後は誰もが知っているように、最初のレイヤーのインデックス値を指定できます。ここではデフォルトは 0 です。
  • WET_K : BIREF 記述子の生成に使用される点ペアの数は通常 2 ですが、3 または 4 に設定することもできます。その場合、記述子間の距離はハミング距離を使用して計算できませんが、バリアントを使用する必要があります。OpenCV では、WET_K = 2 が設定されている場合、ポイント ペアには 2 つのポイントのみが選択され、マッチング時の距離パラメーターには NORM_HAMMING が選択されます。WET_K が 3 または 4 に設定されている場合、BIREF 記述子は 3 または 4 つのポイントを選択します。 、その後、次のようになります。 マッチング時に選択する必要がある距離パラメーターは NORM_HAMMING2 です。
  • coreType : 特徴点の並べ替えに使用されるアルゴリズム。HARRIS_SCORE または FAST_SCORE を選択できますが、前者よりもわずかに速いだけです。
  • patchSize : BIREF 記述子の計算に使用される特徴点近傍サイズ。

例: ORB 記述子を使用したブルート フォース マッチング:

サンプルコード:


import cv2

def orb_test():
    # 加载图片  灰色
    img1 = cv2.imread('images\\quexiao\\2.png')
    gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.imread('images\\quexiao\\2-1.png')

    gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    image1 = gray1.copy()
    image2 = gray2.copy()

    '''
    1.使用ORB算法检测特征点、描述符
    '''
    orb = cv2.ORB_create(128)
    keypoints1, descriptors1 = orb.detectAndCompute(image1, None)
    keypoints2, descriptors2 = orb.detectAndCompute(image2, None)
    # 在图像上绘制关键点
    image1 = cv2.drawKeypoints(image=image1, keypoints=keypoints1, outImage=image1, color=(255, 0, 255),
                               flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    image2 = cv2.drawKeypoints(image=image2, keypoints=keypoints2, outImage=image2, color=(255, 0, 255),
                               flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    # 显示图像
    cv2.imshow('orb_keypoints1', image1)
    cv2.imshow('orb_keypoints2', image2)
    cv2.waitKey(20)

    '''
    2、匹配
    '''
    # 使用汉明距离,创建BF匹配器,并进行匹配() 新版本不支持
   # matcher = cv2.BFMatcher_create(cv2.HAMMING_NORM_TYPE, crossCheck=True)
    matcher = cv2.BFMatcher_create(cv2.NORM_HAMMING, crossCheck=True)
    matchePoints = matcher.match(descriptors1, descriptors2)
    print(type(matchePoints), len(matchePoints), matchePoints[0])
    # 按照距离从小到大排序,选取最优匹配的
    sorted(matchePoints, key=lambda x: x.distance)
    # 绘制最优匹配点
    outImg = None
    outImg = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matchePoints[:10], outImg, matchColor=(0, 255, 0),
                             flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT)
    cv2.imshow('matche', outImg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    orb_test()

ここに画像の説明を挿入

実験の元画像:
2.png
画像の説明を追加してください

2-1.png
画像の説明を追加してください

おすすめ

転載: blog.csdn.net/hai411741962/article/details/132424124