[3D 再構成] 特徴検出とマッチング

シリーズ記事ディレクトリ

このシリーズは 2022 年 12 月 25 日に開始され、 3D 復元プロジェクトの研究中の研究ノートを記録し始めました。主に次の部分に分かれています。

1. カメラ画像と座標系の変換関係

2.カメラのキャリブレーション: Zhang Youzheng キャリブレーション方法

3. 特徴の検出とマッチング

4. 運動回復構造法


記事ディレクトリ:

目次

シリーズ記事ディレクトリ

記事ディレクトリ:

序文:

1. 特徴点の暫定的なまとめ

1.1 記述子

1.2 スケール空間とDOG

1.2.1 スケール空間とガウス畳み込み

 1.2.2 犬のピラミッド

2. 特徴検出 

2.1 キーポイントの位置、スケール、方向の計算 

2.1.1 DOG 極値点

2.1.2 キーポイントの正確な位置決め

2.1.3 エッジ応答の除去

2.1.4 キーポイントのスケール計算

2.1.5 キーポイントの方向一致

2.2 特徴記述子(ベクトル)の計算

2.2.1 ディスクリプタが必要とする画像領域の決定(準備)

2.2.2 座標軸をキーポイントの方向に回転します (最初に回転して編集します) 

2.2.3 キーポイントの近傍のサンプリングポイントを対応するサブ領域に割り当て、サブ領域の勾配値を 8 方向に割り当て、重みを計算します (その後、エディターを各小さなサブ領域にマッピングします)サブ領域の座標を取得する領域編集) 

2.2.4 双一次補間は、シード ポイントの 8 方向に対する各サンプリング ポイントの寄与を計算します。

2.2.5 光の影響を除去して正規化する

2.2.6 記述子ベクトルのしきい値

2.2.7 特徴点のスケールに応じた特徴記述ベクトルの並べ替え

2.2.8 概要

3. コードの実装

4. まとめ

参考:


序文:

        カメラのパラメータ校正後, UAV を使用してデータを収集し, UAV 画像シーケンスを 3D 再構成に使用します. まず, 特徴検出と画像シーケンス間のマッチングが実行されます. この論文は主に特徴検出を記録します.関連する知識と一致する研究ノート。


1. 特徴点の暫定的なまとめ

        画像間のマッチングには、画像内の代表的な領域 (コーナー、エッジ) を使用するのが一般的な方法です。SFM、ビジュアル SLAM など、多くのコンピューター ビジョン プロセスでは、画像に一致する特徴としてコーナー ポイントが抽出されます。

        ただし、純粋なコーナーポイントでは画像内の対応する点の情報をすべて反映できない場合があり、カメラの動きによってコーナーポイントが変化する場合があります。このとき、移動や回転に追従しない変更が必要になります。カメラの照明や特徴点の変化など。

        画像の特徴点は、キーポイント (Keypoint) と記述子 (Descriptor) の2 つの部分で構成されます。キー ポイントは画像内の特徴点の位置を指し、方向とスケールの情報を持つものもあります。記述子は通常、キー ポイントの周囲のピクセルの情報を人工的に設計された方法で記述するベクトルです。通常、記述子は、類似した外観を持つ機能には類似した記述子が必要であることに基づいて設計されます。したがって、を照合する場合、2 つの特徴点の記述子がベクトル空間で同様の距離を持っている限り、それらは同じ特徴点とみなすことができます。

1.1 記述子

        特徴の記述子は通常、キー ポイントとその周囲のピクセルの情報を記述するベクトルです。次のような特徴があります。

  1. 不変性: 画像が拡大、縮小、回転されても特徴が変化しないことを意味します。
  2. 堅牢性: ノイズ、照明、その他の小さな変形の影響を受けません。
  3. 識別性: 各機能記述子は一意かつ排他的であり、互いの類似性が最小限に抑えられます。

矛盾: 記述子の識別可能性とその不変性は矛盾しています。不変性が多い特徴記述子は局所画像コンテンツを区別する能力が弱く、異なる局所画像コンテンツを簡単に区別できる特徴記述子の場合、特徴記述子の堅牢性が低くなることがよくあります。したがって、機能記述子を設計する際には、これら 3 つの特性を総合的に考慮し、3 つのバランスを取る必要があります。

特徴記述子の不変性は、主に次の 2 つの側面に反映されます。

1. スケール不変性

        同じ画像の異なるスケールでも、同じ特徴は変化しません。スケールの不変性を維持するために、特徴点の記述子を計算するとき、通常、画像は均一なスケール空間に変換され、スケール係数が追加されます。この機能がないと、拡大画像と縮小画像の間で同じ特徴点をうまく一致させることができません。

2. 回転不変と
        は、同じ特徴を指し、撮像角度が回転された後も、特徴は変化しないままである可​​能性があります。スケール不変性と同様に、回転不変性を維持するには、特徴点記述子を計算するときにキーポイントの方向情報を追加する必要があります。

        一般的に使用される記述子の計算方法は以下のとおりです (この記事では主にSIFTの計算方法を紹介します)

 

1.2 スケール空間とDOG

1.2.1 スケール空間とガウス畳み込み

        スケールとスケール空間については上で何度も言及しましたが、それらの意味についてはここで説明します。

        まず、2 次元のガウス関数式を確認します。

         異なる σ 値を持つガウス関数を使用して画像を畳み込むと、異なる σ 値を持つ複数のガウス画像が生成されます。ここで、σ 値は異なるスケールになります。

        これは、コンピュータが画像を観察する度合いとして理解できます。画像を観察するとき、画像から遠ざかるほど画像はぼやけます。ローパス フィルター処理にさまざまなガウス コンボリューション カーネルを使用できることは誰もが知っています。画像を使用して画像の詳細情報を削減し、画像をぼかします。これは人間の目で画像を観察するのと同様です。ガウス フィルターの幅 (滑らかさの度合いを決定する) はパラメーター σ によって特徴付けられ、σ は次の値に関連します。滑らかさの度合い。

        したがって、スケールは 2 次元ガウス関数の σ 値であり、異なるスケールのすべての画像が 1 つの元の画像のスケール空間を構成します。「画像スケール空間表現」は、あらゆるスケールにおける画像の記述です。

        スケールは主観的に作成されたものではなく、自然かつ客観的に存在します。ガウス畳み込みは、スケール空間を表す 1 つの形式にすぎません。

        スケール空間式:

         ガウス畳み込みカーネルを次の図に示します。

        コンボリューションカーネルの中心にある元のピクセル値の重みが最も大きく、中心から遠いほど隣接するピクセル値の重みが小さくなります。

        前述のガウス畳み込みは、画像から遠く離れたときに人間の目がぼやけるのと同じように画像をぼやけますが、人間は物体の重要な輪郭を知ることでその物体の情報を知ることができるため、コンピュータでもこれらを使用できます。画像を識別するための重要な情報。

 1.2.2 犬のピラミッド

        DOG ピラミッドを紹介する前に、まずピラミッドについて理解しましょう。

         画像をダウンサンプリングすると、画像にはピクセルが含まれるため、画像のサイズはそれに応じて縮小されます。複数のダウンサンプリングの後、結果が積み上げられてピラミッドを形成します。上の画像のピラミッドは、基礎となる細かい画像をダウンサンプリングすることによって取得されることに注意してください。

        ここでのピラミッドとスケール空間式の違いは次のとおりです。

        1. 画像ピラミッドの各レイヤーの解像度は低下しますが、スケール空間の解像度は変わりません。

        2. 画像ピラミッドの処理速度は、解像度が低下するにつれて高速化されます。

        スケールにその連続性を反映させるために、画像ピラミッドとスケール空間表現を組み合わせて LOG (ラプラスミアン オブ ガウス) ピラミッドを取得する比較的中立的な方法が得られます。

        まず、写真がダウンサンプリングされてさまざまな解像度の画像ピラミッドが取得され、次に画像の各レイヤーでガウス畳み込みが実行されます。最終的な結果は、ピラミッドに基づいて、各レイヤーに異なるスケールの同じ解像度の画像が含まれることになります。ピラミッドの各層の複数の画像をまとめてグループ (オクターブ) と呼びます。ピラミッドの各層には画像のグループが 1 つだけあり、グループの数はピラミッドの層の数に等しく、各グループには複数の画像が含まれます。インターバル画像。

        最後に、LOG に従って DOG が生成されます。

        k は、隣接する 2 スケール空間の倍数の定数です。画像ピラミッドを O 個のグループに分割し、1 つのグループをオクターブと呼びます。各グループは複数のレイヤーに分割され、レイヤー間隔の数は S なので、S+3 になります (S+1+2、2 はレイヤーの追加を表します)画像の上下では、検索極値は中央の S+1 レイヤー画像でのみ検索されます)レイヤー画像、次のグループの画像は前のグループの最後から 2 番目のレイヤーから派生します(レイヤー インデックスが 0 から始まる場合、それは(S 番目の層) 画像のサンプリングが取得され (畳み込み演算の作業負荷を軽減するため)、次に LOG ピラミッドの各層の隣接する画像 (下図の左側) が減算され、すべての画像の再構成されたピラミッドが次のようになります。 DOG ピラミッド(下図右)。

        上記のスケール空間では、\シグマO と S の関係は次のようになります。 

         ここで\シグマ_{0}、 はベースレイヤーのスケール、o はグループのオクターブのインデックス、s はグループの内部レイヤーのインデックスです。キー ポイントのスケール座標は、キー ポイントが配置されているグループとグループ内のレイヤーに従って、上記の式を使用して計算されます。

        最初にピラミッドを構築するとき、入力画像は 0 番目のグループの 0 番目の層の画像として事前にぼかしておく必要があります。これは、最も高い空域のサンプリング レートを破棄することに相当します。したがって、通常は、最初にイメージのスケールを 2 倍にして、-1 グループを生成します。\sigma _{-1} = 0.5初期の入力画像はエイリアシングと戦うためにガウスぼかしが施されていると仮定し、入力画像のサイズを双線形補間で 2 倍にすると同等になります\sigma _{-1} = 1

        選ぶ:

        ガウス ピラミッドを構築する場合、グループ内の各レイヤーのスケール座標は次の式に従って計算されます。

        異なるグループの同じレイヤーのグループ内スケール座標は\シグマ同じです。グループ内の次のレイヤーの画像は、\シグマ前のレイヤーの画像に対してガウスぼかしを実行することによって取得されます。上記の式は、グループ内の異なるスケールのガウス画像を一度に生成するために使用され、グループ内の画像の特定のレイヤーのスケールを計算する場合は、次の式を直接使用して計算します。     

         このグループ内のスケールによって、方向の割り当てと特性評価中のサンプリング ウィンドウのサイズが決まります。最終的に得たもの:

2. 特徴検出 

2.1 キーポイントの位置、スケール、方向の計算 

2.1.1 DOG 極値点

        キーポイントは、DOG 空間内の局所的な極値点で構成されます。

        画像では、各ピクセルが周囲のピクセルと比較され、そのピクセル値が隣接するすべての点よりも大きいか小さい場合、そのピクセルは極点になります。DOG ピラミッドでは、周囲のピクセル点は、現在のレイヤーのスケール差分画像上の周囲の点だけでなく、このレイヤー内の点の異なるスケール差分画像も考慮されます。

        中央の検出点は、同じスケールの 8 つの隣接点と、上下の隣接スケールに対応する 9×2 点、合計 26 点と比較され、スケール空間と 2 つのスケール空間の両方で極点が検出されることが保証されます。 -次元画像空間。

        上記の手法では離散空間内の極値点を求めるため、3次元二次関数のフィッティングによりキー点の位置とスケールを正確に決定すると同時に、コントラストの低い特徴点や不安定なエッジを除去する必要があります。応答ポイント (DOG アルゴリズムがサブウーファーによって強いエッジ応答を生成するため) を調整して、マッチングの安定性を高め、ノイズ耐性を向上させます。

2.1.2 キーポイントの正確な位置決め

        スケール空間における DOG 関数のテイラー展開 (フィッティング関数) は次のとおりです。

         その中にはX = (x, y ,\sigma )^{T}もう一方の側は導関数を取得し、それをゼロに等しくして、極値点のオフセットを取得します。

         このオフセットは、補間中心に対する相対的なオフセットを表します。いずれかの次元のオフセットが 0.5 (つまり、x または y または ) より大きい場合、補間中心が隣接する点に対してオフセットされていることを意味します。現在のキーポイントを変更する必要があります。位置を変更した後、収束するまで新しい位置で補間を繰り返し、反復回数または画像範囲を超えた場合、その点を削除する必要があると判断します。

        極値を方程式に組み込みます。

2.1.3 エッジ応答の除去

        ハリス コーナー ポイントによれば、コーナー ポイントを任意の方向に移動すると、ローカル ウィンドウ内のピクセル値が確実に大幅に変化するはずであり、ローカル ウィンドウ内のピクセル値は、ポイントが移動しても基本的に変化しないことがわかります。エッジ上の はエッジ方向に沿って移動します。ガウス演算子の定義が不十分な差分の極値には、エッジを横切る大きな主曲率と、エッジに垂直な小さな主曲率があります。DOG オペレーターは強いエッジ応答を生成するため、不安定なエッジ応答ポイントを削除する必要があります。

        まず、特徴点からヘッセ行列を取得します。

        H の固有値は D の主曲率に比例します。固有値の比率のみを考慮するため、特定の固有値を見つけることは回避できます。H の固有値 α (大きい) と β (小さい) は、x 方向と y 方向の勾配を表します。

        Tr(H) は行列 H の対角要素の合計を表し、Det(H) は行列 H の行列式を表します。α の固有値が大きいが、β の固有値が小さいと仮定すると、次のようになります\アルファ=r\ベータ

         このようにして、2 つの固有ベクトルの比にのみ関係する式が得られ\ガンマ、特定の固有値とは関係がありません。2 つの固有値が等しい ( = \ガンマ 1) 場合、上記の式は最小値に達し、\ガンマ上の式が大きいほど、 も大きくなります。\ガンマ値が大きいほど、一方向の勾配は大きくなり、反対方向の勾配は小さくなります。上記の現象を防ぐために、エッジを横切る主曲率が大きくなり、垂直方向の主曲率が大きくなります。主曲率が小さい場合は、しきい値\ガンマを に設定するので、次のことを確認するだけで済みます。

         条件を満たした場合、予約されたものとみなされます。

2.1.4 キーポイントのスケール計算

        1.2.2 で導入されました。

 グループ内の各レイヤーのスケール座標は、次の式に従って計算されます。

上記の式は、グループ内の異なるスケールのガウス画像を一度に生成するために使用され、グループ内の画像の特定のレイヤーのスケールを計算する場合は、次の式を直接使用して計算します。     

2.1.5 キーポイントの方向一致

         記述子の回転不変性を達成するために、画像の局所的特徴を使用して各キーポイントの方向を取得し、画像勾配方向を使用して局所構造の安定した方向を取得します。検出されたキーポイントについては、DOGピラミッド上の点の位置とスケールが分かり、そのスケールに対応するガウス画像上の有限差分を用いて(詳細は6の4.3を参照)、特徴点を計算します。中心として、そのガウス ピラミッド イメージの近傍ウィンドウ内のピクセルの大きさと角度:

        勾配の係数 m(x, y) は\sigma = 1.5\times\sigma oct、ガウス分布およびスケール サンプリングの 3σ 原理に従って追加されるため、近傍ウィンドウの半径は です3\times 1.5 \times \sigma oct(s)

         キー ポイント近傍のガウス イメージの勾配計算が完了したら、ヒストグラムを使用して近傍のピクセルの勾配の方向と大きさをカウントします。勾配方向ヒストグラムの横軸は勾配方向角度であり、縦軸は勾配方向角度に対応する勾配振幅累積値である。勾配方向ヒストグラムは、0 ~ 360 度の範囲を 36 のビン (10 度ごとに 1 つのビン) に分割します。ヒストグラムのピークは、キー ポイント付近の画像勾配の主方向、つまりキー ポイントの主方向を表します。

         マッチングのロバスト性を高めるために、ピーク値が主方向のピーク値の 80% を超える方向のみが、このキー ポイントの補助方向として予約されます。SIFT の著者 Lowe の論文では、キーポイントの約 15% が複数の方向を持っているが、これらのポイントはマッチングの安定性にとって重要であると指摘しています。

2.2 特徴記述子(ベクトル)の計算

上記の手順により、キー ポイント        ごとに、位置、スケール、方向の 3 つの情報が得られます次のステップでは、キー ポイントごとに記述子を作成し、一連のベクトルを使用してこのキー ポイントを記述し、照明の変更や視野角の変更などのさまざまな変化によってキー ポイントが変化しないようにします。特徴記述子は特徴点のスケールに関連しているため、勾配の計算は特徴点に対応するガウス画像に対して実行する必要があります。

        周囲のピクセルをブロックに分割してブロック内の勾配ヒストグラムを計算することにより、SIFT 記述子のキーポイントの近傍におけるガウス画像勾配の統計結果を表現したもので、このブロックの固有の抽象的な固有の画像情報は次のようになります。生成されたベクトル。

        Lowe 氏は記事の中で、この記述子はキー ポイント スケール空間の 4×4 ウィンドウで 8 方向の勾配値を計算するために使用され、合計 4×4×8 = 128 次元のベクトルを計算すると説明しました。

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

2.2.1 ディスクリプタが必要とする画像領域の決定(準備)

キー ポイントの周囲をd×d (4×4) のサブ       分割し、各サブ領域をシード ポイントとして使用します。シード ポイントには 8 つの方向があります。つまり、各サブ領域には 8 つの方向があります。そして、サンプリングポイントに従って、これら 8 つの方向の重みを計算します。

        各サブエリアのサイズはキーポイント方向の割り当てと同じです。つまり、各エリアには3\シグマオクトサブサブエリアは\sqrt{3\シグマ oct}辺の長さ の長方形のエリアで囲むことができますが3\シグマ オクト(3\シグマ オクト\leqslant 6\シグマ _0)、は大きくないため、計算を簡略化して辺の長さを とするために、サンプリング ポイントの数は より多くする必要があるため、3\シグマオクト各サブ領域には辺の長さ の長方形領域が割り当てられ3\シグマオクトます

        後で双一次補間を採用する必要があることを考慮すると、必要な画像ウィンドウの辺の長さは次のようになります3\シグマ oct\times(d+1)そして、回転係数を考慮します (次のステップで導入されるキーポイントの方向に座標軸を回転す​​ると便利です)。以下の図に示すように、必要な画像領域の半径が決まります。実際の計算は次のようになります(計算結果は四捨五入されます)。

 

2.2.2 キーポイントの方向に座標軸を回転します(最初に回転します(x'、y')) 

        回転の不変性を保証するために、座標軸はキーポイントの方向に回転されます。左の図は回転前、図内の赤い矢印は現在のキー ポイントの方向を示し、右の図は回転後です。

        回転された近傍内のサンプリング ポイントの新しい座標は次(x'、y')のとおりです。

2.2.3 キーポイントの近傍のサンプリング点を対応するサブエリアに割り当て、サブエリアの勾配値を 8 方向に割り当て、重みを計算します (その後、それを各小さなサブエリアにマッピングして、(x'、y')の各サブエリア(x'', y'')座標 の値を取得します。

        回転したサンプリング点座標を半径 の円内の d×d (4×4) 個の分割領域に割り当て、分割領域に影響を与えるサンプリング点の傾きと方向を計算して 8 方向に割り当てます。

        回転されたサンプリング ポイントは、(x'、y')次の添え字が付いたサブエリアの位置になります(x'', y'')

        その中には、3\シグマオクト準備の最初のステップで得られた各サブ領域の辺の長さがあり、d は後の段階での双線形サンプリングのパラメータです。Lowe は、サブ領域内のピクセルの勾配サイズが\シグマ = 0.5dガウス重み付けによって計算されることを提案しました。

ここで、a、b はガウス ピラミッド イメージ内のキーポイントの位置座標です。

2.2.4 双一次補間は、シード ポイントの 8 方向に対する各サンプリング ポイントの寄与を計算します。

         割り当てはサブエリア内に添え字で示されています(x'', y'')。たとえば、上図の赤点は右上のサブエリアに割り当てられた点です。シード点ごとに線形補間して計算されます(各サブエリアが使用されます)シードポイントとして)貢献します。

         図の赤い点は行 0 と行 1 の間にあり、両方の行に影響します。行 0、列 3 のシード ポイントへの寄与率は dr、行 1、列 3 への寄与率は 1-dr です。同様に、隣接する 2 つの列への寄与率は dc および 1-dc であり、隣接する 2 つの列への寄与率は dc と 1-dc、各方向の寄与率は do と 1-do です。各方向の最終的な累積重量は次のようになります。

   

         ここで、k、m、n は 0 または 1 です。ここでは、この点が行 0、列 3 にあり、方向が 6 であると仮定すると、対応する重みが hist[0][3][6] に追加されると説明されています。

2.2.5 光の影響を除去して正規化する

        以上の手順により、キーポイントスケール空間の4×4ウィンドウ内の8方向の勾配値、合計4×4×8 = 128次元のベクトルHを取得できます。次に、画像を正規化します。

         このうち、H = (h_1, h_2, ..., h_{128})は正規化前に得られた 128 次元のベクトル、L = (l_1, l_2, ..., l_{128})は正規化後の結果です。

2.2.6 記述子ベクトルのしきい値

        非線形照明、カメラの彩度の変化により、一部の方向の勾配値が大きくなりすぎるため、しきい値 (ベクトル正規化後、通常は 0.2) を設定して、大きな勾配値を切り捨てます。次に、特徴の識別を改善するために正規化プロセスが再度実行されます。

2.2.7 特徴点のスケールに応じた特徴記述ベクトルの並べ替え

        特徴点のスケールに従って特徴記述ベクトルを並べ替えます。

2.2.8 概要

        これまでの SIFT 特徴記述ベクトルの生成は次のように要約できます。記述ベクトルの計算範囲を分割した後、最初に回転して取得し、次に各小さなサブ領域にマッピングして各サブ領域内の座標を取得します(x'、y')(x'、y')領域(x'', y'') 、双線形補間 サブ領域 (シード点) の 8 方向に対する各サンプリング点の重み (寄与度) を計算し、正規化してしきい値を設定し、最後に特徴点のスケールに従って特徴記述ベクトルをソートします。

3. コードの実装

        SIFT は後の段階で著作権を申請したため、以前のバージョンではcv2.xfeatures2d.SIFT_create()を使用して SIFT 記述子を作成できます。OpenCV  3.4 以降、SIFT/SURF の関連ライブラリは特許著作権の問題により削除されたため、新しいバージョンではSIFT 記述子を作成できます。バージョンが使用されています cv ライブラリを使用するとエラーが報告されます。

sift = cv2.xfeatures2d.SIFT_create()
key_points, desc = sift.detectAndCompute(img, None)

        この関数はキーポイントと特徴ベクトルを返します。

        重要なポイントには次の情報が含まれます。

pt: キーポイントの座標

angle: キーポイントの方向を示す角度Lowe の論文によれば、方向が変形しないようにするために、SIFT アルゴリズムはキーポイントの周囲の勾配計算を実行することによってポイントの方向を取得します。-1 が初期値です。

サイズ: ポイントの直径のサイズ

class_id: 画像を分類する場合、各特徴点を区別するために class_id を使用します。設定されていない場合は -1 です。自分で設定する必要があります。

オクターブ: ピラミッドのどの層から抽出されたデータかを表します。

レスポンス:レスポンスの度合い、正確にはコーナーの度合い。

4. まとめ

        この記事では、画像の特徴を抽出する方法を紹介します. 特徴を抽出した後、 を照合するとき、2つの特徴点の記述子がベクトル空間内で近い限り、それらは同じ特徴点とみなすことができます。

参考:

1、http://t.csdn.cn/OSm5h

2、http://t.csdn.cn/JyupC

3、http://t.csdn.cn/P12m0

4. SLAMエントリのビジュアルオドメトリ(1): 特徴点のマッチング - Brook_icv - Blog Garden (cnblogs.com)

5、http://t.csdn.cn/5TLRn

6、http://t.csdn.cn/KWgLE

おすすめ

転載: blog.csdn.net/shisniend/article/details/129802075