62

私はopencvが初めてで、2つの画像間の画像マッチングを実装しようとしています。この目的のために、機能記述子、記述子エクストラクタ、および記述子マッチャーの違いを理解しようとしています。私は多くの用語に出くわし、opencv ドキュメント Web サイトでそれらについて読み込もうとしましたが、概念に頭を悩ませているようには見えません。ここで基本的な違いを理解しました。特徴検出と記述子抽出の違い

しかし、このトピックについて勉強しているときに、次の用語に出くわしました。

FAST、GFTT、SIFT、SURF、MSER、STAR、ORB、BRISK、FREAK、BRIEF

FAST、SIFT、SURFがどのように機能するかは理解していますが、上記のうちどれが単なる検出器でどれが抽出器であるかを理解できないようです。

次に、マッチャーがあります。

FlannBased、BruteForce、knnMatch など。

いくつか読んだ後、ここで説明されているように、特定のマッチャーは特定のエクストラクターでしか使用できないことがわかりました。OpenCV ORB Feature Detector はどのように機能しますか? 与えられた分類は非常に明確ですが、それは少数のエクストラクタのみを対象としており、float と uchar の違いがわかりません。

基本的に、誰かお願いできますか

  1. 前述のように、float と uchar に基づいて検出器、エクストラクタ、およびマッチャーのタイプを分類しますか、それとも他のタイプの分類ですか?
  2. float 分類と uchar 分類、またはどちらの分類が使用されているかの違いを説明してください。
  3. さまざまなタイプの検出器、抽出器、マッチャーを初期化 (コーディング) する方法について言及していますか?

私はそれが多くを求めていることを知っていますが、私は非常に感謝しています. ありがとうございました。

4

1 に答える 1

87

FAST、SIFT、SURFがどのように機能するかは理解していますが、上記のうちどれが単なる検出器でどれが抽出器であるかを理解できないようです。

基本的に、機能検出器/抽出器のリスト (記事へのリンク: FASTGFTTSIFTSURFMSERSTARORBBRISKFREAKBRIEF )、それらのいくつかは機能検出器 ( FAST 、 GFTT )のみです。特徴検出器と記述子抽出器 ( SIFT、SURF、ORB、FREAK ) の両方。

私の記憶が正しければ、BRIEFは記述子エクストラクタにすぎないため、FAST や ORB などの他のアルゴリズムによって検出される機能が必要です。

どちらがどちらであるかを確認するには、アルゴリズムに関連する記事を参照するか、opencv ドキュメントを参照して、FeatureDetectorどちらがクラス用に実装されているか、またはクラス用に実装されているかを確認する必要がありますDescriptorExtractor

Q1: 前述のように float と uchar に基づいて、検出器、抽出器、マッチャーの種類を分類しますか、それとも他の種類の分類ですか?

Q2: float 分類と uchar 分類、またはどちらの分類が使用されているかの違いを説明してください。

質問 1 と 2については、float と uchar として分類するために、既に投稿したリンクが私が知っている最良のリファレンスです。誰かがそれを完了することができるかもしれません。

Q3: さまざまなタイプの検出器、抽出器、マッチャーを初期化 (コーディング) する方法について言及してください。

質問 3に答えると、OpenCV はさまざまな型をまったく同じように使用するコードを作成しました。主に、1 つの機能検出器を選択する必要があります。違いのほとんどは、マッチャーのタイプの選択にあり、OpenCV が持っている 3 つのマッチャーについては既に言及しました。ここでの最善の策は、ドキュメント、コード サンプル、および関連する Stack Overflow の質問を読むことです。また、 Ievgen Khvedchenia によるこれらの一連の機能検出器ベンチマークなど、いくつかのブログ投稿は優れた情報源です(ブログは利用できなくなったため、Google キャッシュから生のテキスト コピーを作成する必要がありました)。

マッチャーは、記述子がリストの別の記述子と類似しているかどうかを調べるために使用されます。クエリ記述子をリストの他のすべての記述子と比較する ( BruteForce ) か、より優れたヒューリスティックを使用する ( FlannBased, knnMatch ) ことができます。問題は、ヒューリスティックがすべてのタイプの記述子に対して機能しないことです。たとえば、FlannBased の実装はfloat記述子のみで機能し、 uchar's では機能しませんでした (ただし、2.4.0 以降、LSH インデックスを使用した FlannBased は uchar 記述子に適用できます)。

タイプに関するこの App-Solut ブログ投稿を引用します。DescriptorMatcher

DescriptorMatcher には、「FlannBased」、「BruteForceMatcher」、「BruteForce-L1」、および「BruteForce-HammingLUT」という種類があります。「FlannBased」マッチャーは、ボンネットの下で flann (近似最近傍の高速ライブラリ) ライブラリを使用して、より高速で近似マッチングを実行します。「BruteForce-*」バージョンは、辞書を徹底的に検索して、画像の特徴が辞書内の単語に最も近いものを見つけます。

より一般的な組み合わせのいくつかは次のとおりです。

機能検出器 / 記述子抽出器 / マッチャー タイプ

  • (FAST, SURF) / SURF / フランベース

  • (FAST、SIFT) / SIFT / フランベース

  • (FAST, ORB) / ORB / ブルートフォース

  • (FAST, ORB) / Brief / ブルートフォース

  • (FAST, SURF) / FREAK / ブルートフォース

また、機能検出器へのアダプター (動的、ピラミッド、グリッド)がいくつかあることに気付いたかもしれません。App-Solut のブログ投稿は、それらの使用法を非常にうまくまとめています。

(...) また、キーポイント検出器の動作を変更するために使用できるアダプターもいくつかあります。たとえばDynamic 、画像内で十分なキーポイントが見つかるまで検出器タイプ固有の検出しきい値を調整するPyramidアダプターや、複数のスケールでポイントを検出するためにガウス ピラミッドを構築するアダプターなどです。アダプターは、Pyramidスケール不変ではない機能記述子に役立ちます。

参考文献:

  • Yu Lu によるこのブログ投稿では、SIFT、FAST、SURF、BRIEF、ORB、BRISK、および FREAK に関する非常に優れた要約説明を行っています。

  • Gil Levi によるこれらの一連の投稿では、これらのアルゴリズムのいくつか (BRIEF、ORB、BRISK、および FREAK) についても詳細にまとめています。

于 2013-02-16T15:55:26.297 に答える