1

フレームの違いを使って動きを検出しようとしています。動きがある場合は別の方法を入力し、ない場合はその方法を入力しません。問題は、absdiff()またはbitwise_xor()のいずれかを使用してフレームの違いを作成すると、ノイズの多いフレームが取得され、常にモーションとして検出されることです。

erode()メソッドとdilate()メソッドを使用してそのノイズを除去しようとしました。ノイズの影響は減少しますが、それでもノイズがあります。このノイズを取り除くにはどうすればよいですか?

私の現在のコードの一部:

capture >> Frame; // get a new frame from camera

cvtColor(Frame,Frame1,CV_RGB2GRAY);
threshold(Frame1,Frame1,50,255,CV_THRESH_BINARY);

waitKey(500);
capture >> PreFrame;

cvtColor(PreFrame,PreFrame,CV_RGB2GRAY);
threshold(PreFrame,PreFrame,50,255,CV_THRESH_BINARY);

//Result = Frame1 - PreFrame1;
//absdiff(Frame1,PreFrame1,Result);

bitwise_xor(Frame1,PreFrame,Result);
erode(Result,Result,Mat());
dilate(Result,Result,Mat());

imshow("Result",Result);

if (norm(Result,NORM_L1)==0){
    printf(" no change \n")
}
else
{
    // motion detected
}
4

3 に答える 3

3

フレームをキャプチャした直後に次のテクニックのいずれかを適用するだけで、いくつかの異なる方法でノイズを減らすことができます。

ぼかし(フレーム内の平均化)

次のようないくつかの異なるぼかし演算子を見てください。

  1. ぼかし(速いが滑らかではない)
  2. GaussianBlur(遅いがスムーズ)
  3. medianBlur(インパルスノイズを低減します)

medianBlur画像のエッジを維持しながらインパルスノイズを制御するのに適しています。

フレーム平均化(異なるフレームの平均化)

  1. 蓄積する
  2. AccumulateWeighted

フレーム平均化では、累積結果を累積フレーム数で割って、平均化されたフレームを取得します。ノイズを大幅に減らすために、たとえば5〜10フレームの移動平均ウィンドウが必要になる場合があります。ただし、ウィンドウサイズが大きいほど、オブジェクトが視野に出入りするときにモーションブラーが大きくなります。これは、カメラが動かない場合に最適に機能します。

お役に立てば幸いです。

于 2012-05-24T13:30:48.610 に答える
1

グレースケール画像の絶対差を取り、その結果をしきい値設定して小さな強度の変化を取り除くとどうなりますか?これにより、フレームごとにピクセル強度をわずかに変化させることができますが、大きな変化があった場合でもモーション検出器がトリガーされます。

例えば:

// Obtain image two images in grayscale
cvtColor(Frame,Frame1,CV_RGB2GRAY);
cvtColor(PreFrame,PreFrame,CV_RGB2GRAY);

// Take the absolute difference, this will be zero for identical
// pixels, and larger for greater differences
absdiff(Frame, PreFrame, Result)

// Threshold to remove small differences
threshold(Result,Result,20,255,CV_THRESH_BINARY);

// Prepare output, using Result as a mask
Mat output = Mat::zeros(Frame.size(), Frame.type());
add(
    Frame,   // Add frame
    0,       // and zero
    output,  // to output
    Result   // Only if result is non-zero
);

共有できる入出力画像の例はありますか?

于 2012-05-24T14:30:53.730 に答える
0

差をとる前に画像をしきい値処理することで、ノイズの影響を大幅に増やすことができます。absdiffの代わりに、グレースケール画像を直接減算しbitwise_xorます。

于 2012-05-24T15:30:21.763 に答える