SURFを使用して2 つの画像を照合します。そのため、ある絵が別の絵に似ていると判断するタイミングがわかりません。助けてくれませんか?
3 に答える
SURF はコンピューター ビジョン アルゴリズムです。検出器と記述子があり、2 つの画像が同じかどうかはわかりません。ディテクタはインタレスト ポイント (IP) を検出し、記述子はそれを 64 ビット長のベクトルとして記述します。SURF の検出アルゴリズムと記述子の両方を両方の画像で実行する必要があります。いくつかのマッチャー アルゴリズム (ブルートフォース、フラン) を使用すると、2 つの画像が X パーセントで類似していると言えます。ORB または BRIEF を試すことをお勧めしますが、これらはバイナリ ベクトルを生成します。役立つ記事:ここ またはここ225 ~ 228 ページの「携帯電話の視覚的マークの認識」という私の記事を参照できます。
編集:
matcher の出力は、記述子間の距離のベクトルです。距離が小さいほど、記述子は似ています。
OpenCVのサンプルファイルdescriptor_extractor_matcher.cppを確認する必要があります。filteredMatches.distance
値を比較メトリックとして合計することにより、コードをカスタマイズできます。記述子間の距離です(features2d.hppを参照)。
また、2つの画像を一致させる場合は、HSVヒストグラム比較を使用します。compareHist_Demo.cppを確認してください
これは、分類問題のカテゴリに適合するために必要な類似度によって異なります。
最も基本的なケースでは、画像/オブジェクトのn次元の記述ベクトルがあります。次に、これをトレーニングセット内のオブジェクトのベクトルに適合させることができます。その場合、さまざまな状況に応じてさまざまなアルゴリズムが最適です。OpenCVはここでさまざまな可能性を提供します。パラメータは、受け入れても構わないと思っている誤検知などの割合にも依存します。
トレーニングセット(分類子の「学習」を学習する)があり、システムの結果を制御できるテストセットがあります。より詳細なヘルプについては、アプリケーション、つまり要件、サンプル画像などについて詳しく知る必要があります。
編集:サンプルのfind_obj.cppは、オブジェクト(box.png)が実際にシーン(box_in_scene.png)で見つかったかどうかを判断しません。ボックスで見つかったものに最もよく対応するシーン内のSURFポイントのみが見つかります。そのため、誤って一致したポイントペアもあります。決定を下したい場合、一致が「見つかった」とカウントされる場合、たとえば、見つかった一致の最大平均距離(DMatch構造体のメンバー)を設定するか、適切な変換行列が可能かどうかを確認することで、これを行うことができます。計算されます(たとえば、findHomographyを使用)。これは、次のチュートリアルで示されています:http: //docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homographyまた、可能であれば、かなり複雑なC APIではなく、OpenCVの新しいcppAPIを使用することをお勧めします。これにより、プログラムの複雑さが軽減され、アプリケーションの重要な(アルゴリズム)部分に集中しやすくなります。さらに、Csabiがすでに述べたように、ORBもご覧になることをお勧めします。