web-dev-qa-db-ja.com

パターンマッチング-2番目の画像で参照オブジェクトを検索[OpenCV?]

参照オブジェクト(コインなど)を含む参照白黒画像があります。オブジェクトは、ユーザーによってマークされます。つまり、関心領域です。

次に、他の画像を分析して、そのオブジェクトまたは同様のオブジェクトの位置と回転を見つけたいと思います。オブジェクトはカメラの下に任意に配置されますが、拡大縮小されることはなく、視野角は常に90度です。

私は私が望むことを正確に実行する商用ライブラリを評価しました: Euresys EasyFind

以下に、手元にあるタスクのサンプル画像を示します。現在の実装では、OpenCVの特徴検出を使用しており、問題なく機能していません。

テンプレート:

enter image description here

まったく同じコインに一致するものが見つかりました:

enter image description here

わずかに異なるコインでは試合は失敗します:

enter image description here

特徴検出は間違ったアプローチのようです。どういうわけか単にオブジェクトを単純化する必要があります。しかし、そうすると(Blur、Canny、CornerHarris)、特徴検出はまったく機能しません。

堅実なアプローチのためのアドバイスは大歓迎です。別のライブラリの提案も素晴らしいでしょう。

18
testalino

あなたはかなりの数の可能なテクニックを試したので、私はあなたに以下のリンクを通過するようにお願いします(あなたは通過したかもしれません!!!)

  1. すべての機能検出器と記述子の比較
  2. サーフ、フリーク、ブリスクの組み合わせ

失敗した3番目の画像はコントラストが低く、残りの2つと完全に一致させるのは少し難しいです...そこでコントラスト調整を行い、OrbFeatureDetectorとOrbDescriptorExtractorで次の一致を取得します..コントラスト調整を適用しました特徴検出の前にすべての画像に。

画像1と画像3

enter image description here

画像2と画像3

enter image description here

画像1と画像2(この組み合わせはすべての検出器/抽出器ペアでうまく機能します)

enter image description here

マッチングにはBruteForceMatcher<Hamming> matcherを使用しました。ポイントはローカライズされていますが、方向は非常にうまく推測できます。複数の手法を使用し、最初に円検出を実行して、特徴検出を可能な限り最小のROIに制限する必要があります。加えて、円の中心に対する検出されたポイントの方向は、新しい方向情報を簡単に提供します。 1番目のリンクと2番目のリンクを参照すると、SURFとBRIEFは、光の強度の変化とぼやけに対して非常に耐性があることがわかります。したがって、SURFとBRIEFの組み合わせも試すことができます。

9
rotating_image

いかなる種類の前処理も実行せずに入力にキーポイント検出器を適用することは、関連する興味深いマッチングポイントを見つけるための非常に貧弱な方法です。

画像が与えられると、数学的形態学はそれらを前処理し、うまくいけば後のステップでより良い一致を取得するための優れたツールを提供します。これらのツールの1つは形態学的再構成と呼ばれ、その一般化はレベリングと呼ばれ、マーカー画像に基づいてフラットゾーンをマージおよび拡張します。ご覧のとおり、画像はどこにでも谷(暗い点)があるという意味で非常にノイズが多いので、そのほとんどを抑制したいと思います。レベリングの実装はまったく難しいことではありませんが、無料で利用できるツールを知らないので(実際には、フランスで開発された大規模なフレームワークが含まれていると思いますが、名前は覚えていません)、より標準的な形態学的再構成。マーカー画像もありませんが、簡単に作成できます。構造要素を使用して画像を侵食し、一部の作成者によって測地線開口部と呼ばれる形態学的再構成を適用します。これにより、ノイズの多い谷の一部が抑制されます。

この時点で、画像はいくつかのキーポイント検出器で使用するとよいかもしれませんが、一致させたいものはグレースケールトーンとは無関係であるため、画像を2値化することをお勧めします。このための典型的な自動方法は大津によって与えられますが、ヒストグラムエントロピー最小化に行くカプールの方法のような他のものがあります。私はそれが非常に一般的であるという理由だけで大津を使用しませんでした、いくつかのStackoverflow-noveltyのために私はこの他の方法を選びました:P(はい、非常に悪い理由)。最後に、2値化後、画像の処理を続行できます。いくつかの残りのノイズポイントを削除したいので、ここでは単一の形態学的クロージングで十分かもしれません(コンポーネントから必ずしも切断されていないため、コンポーネントを削除することは潜在的に悪い選択です)。

短くするために、最初の画像の測地線の開始と最終的な前処理(上記のポイントを使用)を次に示します。

enter image description hereenter image description here

そして、これが他の2つの画像の最終結果です(まったく同じプロセスを適用し、一定の変更などは行いません)。

enter image description hereenter image description here

ここで、一般的なSURFメソッドを使用してこれらを一致させると、ほぼ完全に一致するため、他の問題(一方を他方に対して方向付ける)を非常に簡単に解決できます。 OpenCVまたは他の正しい実装を使用して同じ結果が得られるはずなので、(誰かが結果を比較したい場合を除いて)得たマッチングの結果は含めません。

重要な場合は、上記の前処理を実現するためのMathematicaの1行を次に示します。

g = Closing[Binarize[GeodesicOpening[f, DiskMatrix[5]], Method -> "Entropy"], 1]

ここで、fはグレースケールの入力画像であり、gは結果のバイナリ画像です。

4
mmgp

質問は非常に広く、正確に何を達成したいかに応じて多くの方法があります。ハフ変換を使用すると、コインは丸いので検出できますが、多くの丸い要素を検出する可能性があります(したがって、他の同様のものが表示されているかどうかによって異なります)。

より一般的には、特徴検出器(SURF、ORB、FAST、Shi-Tomassi)を使用して、コインのある参照フレームと探しているフレームの間で抽出と照合を行う必要があります。次に、Homography Transformを使用して、見つけたポイントが同じであることを確認できます。これにより、コインが見つかります。

この例を見てください:

Features2D +既知のオブジェクトを見つけるためのホモグラフィ

3

一般に、変更がシステムパフォーマンスに影響を与える可能性がある場合、次の手順があります。

  1. 検出器とその構成
  2. 記述子とその構成
  3. マッチャーとその構成
  4. RANSACパラメーター(または使用しているもの)

MSER(最大安定極値領域) を検出器として試すことができます。この検出器は、SIFT/SURFのような他の検出器ほど多くのキーポイントを見つけられないことが知られています。しかし、それらは非常に安定していてユニークです。しかし、私はマッチングのために別の記述子を試してみます。おそらく FREAK(Fast Retina Keypoint)

RANSACアルゴリズムを使用したフィルタリングで十分ですが、好きな距離を設定することでいつでも微調整できます。 RANSACがうまく機能しない場合は、うまく機能するようになるまでデフォルトのしきい値を切り替えてみてください。

変更できるもう1つのことは、マッチャーです。 FLANNは非常に優れていますが、結果を概算するだけであり、高次元空間で検索するときに優れたパフォーマンスを発揮します。ただし、パフォーマンスに関係がない場合は、ユークリッド距離またはマハラノビス距離のBruteForceMatcherを試してください。

[EDIT-1]:*今、私はあなたに追加の可能性のある-あなたの提案を与えることを試みています=) *Kampel etal。彼らの記事「古代コインの画像ベースの検索と識別」で、アイテムの記述機能を強化するために、古代のコインに形状記述子を与えるためのいくつかの追加のアプローチについて説明します。

もう1つの問題は、外れ値を排除するための非常に制限的なアプローチであるRANSACである可能性があります。メソッドMat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )には追加のパラメーターがあります( このリンクをクリック )。すべてのポイント、RANSACまたは最小中央値のロバストな方法を使用できます。

または、適切な一致を取得するための適切なしきい値となる可能性のある距離を確実に計算しようとします。標準のチュートリアルでは、最小検出距離の2倍を使用します。これは開始ですが、currentの一致距離に依存するため、あまり堅牢ではありません。

標準のOpenCVに含まれていない他のいくつかの記述子/検出器があります。 Lindbjergは、彼の論文「Finding the Best Feature Detector-DescriptorCombination」でMSERがDAISY-Descriptorを使用して動作することを説明しています。または、 [〜#〜] agast [〜#〜] または [〜#〜] brisk [〜#〜] を試すこともできます。本当の大きな欠点の1つは、それらがすべて標準のOpenCVディストリビューションに含まれていないことです。いくつかの実装がありますが、それらを統合する必要があるため、多くの作業が必要になる可能性があります。

3
Mr.Mountain

cvMatchTemplateに似た、ブルートフォース検索のバージョンが最適だと思います。 すべて特徴抽出ベースの検索は非常にノイズに敏感です。特定のタイプの特徴が対象のすべての画像で目立つようになることを事前に知っている理由がない限り(たとえば、コインの輪郭の円/楕円)、特徴抽出によって優れたパフォーマンスが得られる可能性はほとんどありません。ブルートフォースマッチングの問題は、スケールと回転に敏感であるということです。おそらく、スケールフリーマッチング、および/またはブルートフォース可能なスケールと回転についての文献を見ることができます。提供したサンプル画像の場合、数度回転して数パーセント拡大すると、実際にはかなりよく一致します。回転され、スケーリングされたバージョンを見つけるには、cvMatchTemplateを数百回呼び出すだけで済みます。

1
Alex I