我正在尝试使用帧差来检测运动。如果有动作,我会输入另一种方法,如果没有,我将不会输入该方法。问题是当我通过使用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
}
答案 0 :(得分:3)
只需在捕获帧后立即应用以下技术之一,您就可以通过几种不同的方式降低噪音:
看看几个不同的模糊操作符,例如:
medianBlur
适用于控制脉冲噪声,同时保留图像中的边缘。
对于帧平均,只需将累计结果除以累积的帧数即可得到平均帧。你可能想要一个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
直接对灰度图像进行减法。