6

私は現在、私の意見ではかなり解決しやすいはずの共通の問題に直面していますが、これまで私が近づいてきたすべてが失敗してしまったので、コンピュータビジョンでの形状/パターンマッチングアプローチ

私は問題がいくつかのイラストで最もよく説明されていると思います。

Picture

:この(この1つは由来写真はかなり薄暗いだったので、おそらくより良い)私はまたのようなイメージを持っている

Pattern 1 Pattern 3

:私は、これら二つのようないくつかのパターンを持っています

(画像のサイズにちょうど適合するようにテンプレートがどのようにスケーリングされたかに注意してください)

究極の目標は、ユーザーサム・アップ/サム・ダウン・ジェスチャーと、その間のある角度を示しています。だから私はパターンと画像を照合して、どの画像が最も似ているのか(より正確には、手が示す角度)を見たいと思います。私は、親指がパターンに表示されている方向を知っています。したがって、同じように見えるパターンを見つけたら、角度もあります。

私はOpenCV(Python Bindings)を使って作業しており、すでにcvMatchTemplateとMatchShapesを試していましたが、これまでのところ本当に確実に動作していません。

私はMatchTemplateが失敗した理由を推測することができますが、小さい白の小さなパターンは画像の白い部分に完全にフィットし、最もよく一致する要素を作成します。

OpenCVに隠れているいくつかのメソッドがありますか?まだ見つかりませんか?再実装するべき問題の種類については既知のアルゴリズムがありますか?

新年あけましておめでとうございます。

答えて

6

いくつかの簡単な技術は、仕事ができる:

  1. 値化及びセグメンテーション後、(点、または長径間の最も遠い距離別名)ブロブのフェレ径を見つけます。
  2. ポイントセットの凸包を見つけ、floodで塗りつぶして、それを連結領域として扱います。親指で元の画像を引きます。違いは、親指と拳の間の領域であり、その領域の重心に対する相対的な位置は、回転の指示を与えるはずです。
  3. 各点とブロブエッジの距離に関するウォーターシェッドアルゴリズムを使用します。これは、接続された薄い領域(親指)を識別するのに役立ちます。
  4. ブロブ内で最大の円(または最大の内接多角形)をフィットさせます。エッジの一部が背景と重なるまで、この円またはポリゴンを拡大します。元の画像からこの拡大図を差し引く。親指だけが残ります。
  5. 手のサイズが一貫している(または比較的一貫性のある)場合、親指が消えるまでN個の形態学的侵食操作を実行し、次にNを大きくして握りこぶしを元のおおよそのサイズに戻します。親ブロブを取得するために、元のブロブからこの拳だけのブロブを差し引く。次に、親指のブロブの方向(Feretの直径)および/またはブロブの重心との相対的な質量の中心を使用して方向を決定する。

臨界点(強い方向の変化のある領域)を見つけるテクニックは、よりトリッキーです。最も簡単には、コーナーディテクタを使用し、あるコーナーから別のコーナーまでの距離を確認して、親指の内側エッジが拳と出会う場所を特定することもできます。

さらに複雑な方法については、Kimia、Siddiqi、Xiaofing Miなどの著者による形状分解についての論文を参照してください。

1

MatchTemplateは、問題の説明に適しているようです。どのような方法でそれはあなたのために失敗ですか?あなたが実際にあなたのサンプル画像に表示するようにサムスンアップ/サムズダウン/サムス間の看板を実際にマスキングしている場合、あなたはすでに最も困難な部分を行っています。

MatchTemplateには検索スペース内に回転とスケーリングが含まれていないため、検出するすべての回転で参照画像からさらに多くのテンプレートを生成する必要があります。サムズアップ/サムズダウンサイン。

[編集] MatchTemplateの結果配列には、イメージ内のテンプレートがその場所にどのくらいフィットするかを指定する整数値が含まれています。 CV_TM_SQDIFFを使用すると、結果配列の最下位の値が最適な位置になります。CV_TM_CCORRまたはCV_TM_CCOEFFを使用すると、最も高い値になります。スケーリングされ回転されたテンプレートイメージの白いピクセル数が同じ場合は、すべてのテンプレートイメージすべてのベストフィット値を比較することができます。また、全体的に最適なテンプレートイメージが選択します。

おそらくあなたを助けることができる回転/スケーリングの独立した検出機能がたくさんありますが、問題を正規化してMatchTemplateを使用するのがはるかに簡単です。より高度なもののため

SIFTHaar feature based classifiers、またはone of the others available in OpenCV

+0

はい、提供される画像は元の画像です。そのことは、例えば、第2のパターン画像は、サンプル画像と比較したときに、最良のマッチング値を有していない。それらが画像のようにほぼ同じ大きさであっても。特別なmatchtemplateメソッド(CV_TM_SQDIFF、...)をお勧めしますか?私が得た価値は何ですか?画像全体のエラー? 1ピクセルあたりの距離(私はそれを画像のサイズなどで分割する必要がありますか?) – Nicolas

+0

あなたの質問に答えるために私の答えが更新されました。 –

+0

拳のような "伸縮性のある"形状の場合、マッチテンプレートはあなたの望むように常に機能するとは限りません。回転、スケーリング、およびアフィン変換は、個々のコンポーネントの区分的な回転と伸びを考慮していません。形態学的手法とセグメンテーション手法の組み合わせが機能しない場合は、「形状の分解」に関する論文を探すことを検討してください。 – Rethunk

1

をチェックアウト、私はあなただけ白を経由遠い最短経路を持っている2つの点を計算する場合には、優れた結果を得ることができると思います。親指が指している方向は、2点を結ぶ線の方向になります。

白い部分の点をサンプリングし、Floyd-Warshallを使用すると簡単にこれを行うことができます。

+0

これは面白いアプローチのように聞こえるかもしれませんが、もっと詳しく説明できますか? 「白い部分のサンプリング点」と、そのようなアルゴリズムを使用して問題を解決する方法を理解することはできません。 – Nicolas

+1

技術をよく説明しているこのホワイトペーパーを参照してください。 「インナーを使用したシェイプ分類「距離」(Ling and Jacobs) www.cs.umd.edu/~djacobs/pubs_files/ID-pami-8.pdf – Rethunk

関連する問題