1

関数 cvAbsDiff(img1, img2, dest); を使用して 2 つの画像を減算しようとしています。それは機能しますが、頭や体の前に手を持ってくると、手がはっきりせず、背景が画像に入ることがあります...背景画像(頭)が前景(手)に重なっています。

背景が壁のような平らな表面でも正しく機能します。

私の画像をチェックしてください...私の問題をよりよく理解できるように...!!!!

http://www.2shared.com/photo/hJghiq4b/bg_overlays_foreground.html

解決策/ヒントがあれば助けてください.......

4

2 に答える 2

1

コードに問題はありません。背景減算は、あまり堅牢ではないため、モーション検出またはシルエット検出に適した方法ではありません。背景と前景の両方が多くの領域で色が似ているため、減算で前景が後ろに押し出されるため、問題が発生します。使用してみてください - モーション検出用のオプティカル フロー - タスクが単にシルエットや手を検出するだけの場合は、その上で HOG 分類器をトレーニングしてみてください

新しいアプローチを試したくない場合。しきい値(あなたの場合は 30 )を試してみてください。したがって、同様のカラー画像を減算すると、差は 30 未満になります。後で 30 でしきい値を設定すると、真っ暗になります。また、HSV やその他の色空間を試すこともできます。

于 2012-03-18T10:34:16.663 に答える
1

関連するコードを入れると役立ちます。また、実際に何を達成しようとしているのかを知ることもできます。

どの2つの画像を減算していますか? 後続の画像 (つまり、数分の 1 秒の遅延で撮影された画像) の減算を行いました。背景の減算は、通常、動きのあるオブジェクトのエッジ、たとえば手のエッジになり、シルエット全体ではありません。手。現在のフレームと静的な起動フレームの違いを取っていると思います。パーツが十分に異なっていない可能性があります (スキン + スキン)。

今夜、コンピューターに問題が発生しました。明日テストします (少なくとも、実際に実行する手順をすべて記載してください)。お知らせします。


最終的な目標が何であるかはまだわかりませんが、ジェスチャー認識を行いたいと思っていると思います(「指」と呼ばれるベクトルがあるため)。マンプリートが言ったように、あなたの最大の問題は堅牢性であり、それは似たような色の被写体からです.

静的な比較画像に私の顔を入れて移動することで、あなたの画像を再現しました。背景だけで始めた場合、それはすでにはるかに堅牢であり、いずれにせよ「オーバーレイ」は表示されませんでした.

簡単な修正は、被写体のないきれいな静止画像を用意することです。それ以外の場合は、動的な比較画像が必要になります。最も簡単なのは、frame_n と frame_n-1 を比較することです。ただし、これにより通常は動くエッジだけが得られるため、シルエット全体が必要な場合は、次のいずれかを実行できます。

1) 別のセグメンテーション アルゴリズムを使用する (これをお勧めします。バックグラウンド減算は高速であり、それを使用して検索対象のはるかに小さい ROI を決定し、別のアルゴリズムを使用してより堅牢なセグメンテーションを行うことができます。)

2) 過去 10 フレームの平均など、静的比較画像と動的比較画像の間で妥協点を作るようにしてください。これがどれほどうまく機能するかはわかりませんが、実装は非常に簡単で、試してみる価値があります:)。

また、しきい値に 30 の代わりに CV_THRESH_OTSU を試してみてください。

また、出力フレア (変更されていない領域が黒から白に切り替わる) が頻繁に発生することに気付きました。ライブ ストリームで確認すると、ウェブカメラのオートフォーカス/ホワイト バランスの調整などが原因であると確信しています。それも取得している場合は、オートフォーカスなどをオフにすると役立つはずです (ところで、これは openCV では行われませんが、おそらくこれを確認してください: How to programatically disable the auto-focus of a webcam? )

于 2012-03-17T20:10:07.967 に答える