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有利于控制脉冲噪声,同时保留图像中的边缘。

帧平均(平均不同帧)

  1. 积累
  2. 累积加权

使用帧平均只需将累积的结果除以累积的帧数即可获得平均帧。您可能想要一个 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 回答