帧差噪声?

时间:2012-05-24 11:51:00

标签: c++ image-processing opencv

我正在尝试使用帧差来检测运动。如果有动作,我会输入另一种方法,如果没有,我将不会输入该方法。问题是当我通过使用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
}

3 个答案:

答案 0 :(得分:3)

只需在捕获帧后立即应用以下技术之一,您就可以通过几种不同的方式降低噪音:

模糊(帧内平均)

看看几个不同的模糊操作符,例如:

  1. blur(快速,但不太顺畅)
  2. GaussianBlur(更慢,但更顺畅)
  3. medianBlur(减少脉冲噪音)
  4. medianBlur适用于控制脉冲噪声,同时保留图像中的边缘。

    帧平均(平均不同帧)

    1. accumulate
    2. accumulateWeighted
    3. 对于帧平均,只需将累计结果除以累积的帧数即可得到平均帧。你可能想要一个5-10帧的滚动平均窗口来显着降低噪音。但是,当对象移入和移出视野时,较高的窗口大小意味着更多的运动模糊。如果您的相机一动不动,这将最有效。

      希望有所帮助!

答案 1 :(得分: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
);

您是否有可以共享的任何输入/输出图像?

答案 2 :(得分:0)

通过在拍摄差异之前对图像进行阈值处理,可以大大增加噪点的影响。使用absdiff而不是bitwise_xor直接对灰度图像进行减法。