C++ 帧差噪声?
我尝试使用帧差来检测运动。如果有议案,我会输入另一种方法;如果没有,我不会输入那种方法。问题是,当我使用absdiff()或bitwise_xor()进行帧差分时,会得到一个噪声帧,它总是被检测为运动 我试图通过使用腐蚀()和扩张()方法来消除噪声,它减少了噪声的影响,但仍然存在噪声。如何消除这种噪音 我当前代码的一部分:C++ 帧差噪声?,c++,image-processing,opencv,C++,Image Processing,Opencv,我尝试使用帧差来检测运动。如果有议案,我会输入另一种方法;如果没有,我不会输入那种方法。问题是,当我使用absdiff()或bitwise_xor()进行帧差分时,会得到一个噪声帧,它总是被检测为运动 我试图通过使用腐蚀()和扩张()方法来消除噪声,它减少了噪声的影响,但仍然存在噪声。如何消除这种噪音 我当前代码的一部分: capture >> Frame; // get a new frame from camera cvtColor(Frame,Frame1,CV_RGB2GR
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
}
您可以通过几种不同的方式降低噪声,只需在捕获帧后立即应用以下技术之一: 模糊(帧内平均) 请看一些不同的模糊操作符,如:
medianBlur
有助于控制脉冲噪声,同时保留图像中的边缘
帧平均(平均不同帧)
对于帧平均,只需将累积结果除以累积的帧数即可得到平均帧。您可能需要一个滚动平均窗口,例如5-10帧,以显著降低噪音。但是,当对象移入或移出视野时,窗口大小越大,意味着运动越模糊。如果你的相机是静止的,这将是最好的
希望有帮助 您可以通过几种不同的方式降低噪音,只需在捕获帧后立即应用以下技术之一: 模糊(帧内平均) 请看一些不同的模糊操作符,如:
medianBlur
有助于控制脉冲噪声,同时保留图像中的边缘
帧平均(平均不同帧)
对于帧平均,只需将累积结果除以累积的帧数即可得到平均帧。您可能需要一个滚动平均窗口,例如5-10帧,以显著降低噪音。但是,当对象移入或移出视野时,窗口大小越大,意味着运动越模糊。如果你的相机是静止的,这将是最好的
希望有帮助 如果获取灰度图像的绝对差值,然后对结果设置阈值以消除轻微的强度变化,会发生什么情况?这将允许像素强度帧到帧的微小变化,同时如果有任何重大变化,仍会触发运动检测器 例如:
// 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
);
您有任何可以共享的示例输入/输出图像吗?如果获取灰度图像的绝对差值,然后对结果设置阈值以消除轻微的强度变化,会发生什么情况?这将允许像素强度帧到帧的微小变化,同时如果有任何重大变化,仍会触发运动检测器 例如:
// 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
);
您有任何可以共享的输入/输出图像示例吗?通过在获取差异之前对图像进行阈值化,您可以大大增强噪声的效果。直接使用
absdiff
对灰度图像进行减法,而不是按位异或通过在进行差分之前对图像进行阈值化,可以大大提高噪声的效果。直接使用absdiff
而不是按位异或对灰度图像进行减法将消除读出噪声(帧间差异)。模糊将消除像素差异,如FPN和PRNU。帧平均将消除读出噪声(帧间差异)。模糊将消除像素差异,如FPN和PRNU。可能的重复无法完全消除噪声。您应该尝试并采用“非常低的变化”的方法工作-例如,查看噪声的平均值,然后将低于平均值的所有帧差异视为噪声造成的。高于平均值,称之为“高变化”,如果你愿意,你假设图像中除了噪声影响之外还有其他影响,然后去计算所需的内容。可能的重复没有办法完全消除噪声。你应该尝试采用“非常低变化”的方法工作——例如,看看噪声的平均值是多少,然后,所有低于平均值的帧差异被视为是由于噪声引起的。所有这些都高于平均值,如果你愿意,可以称之为“高变化”,你假设图像中除了噪声影响之外还有其他影响,然后去计算所需的内容。@Mark Ransom谢谢你的帮助,这种方法可以最小化噪声,但帧颜色以一种奇怪的方式出现,我不知道为什么?!你说的框架颜色是什么意思?您已经转换为灰度,执行了图像减法,然后对结果进行了阈值化,因此result
是一个二值图像,对应于图像中任何显著的强度变化。之后,我必须将帧返回到RGB,因此我使用了cvtColor(result,Result1,CV_GRAY2RGB);按位_和(Result1,Frame,SResult1)@Amr我已经用可能的解决方案更新了我的答案。如果我理解正确,您基本上希望使用结果作为遮罩从输入图像中选择特定像素。在这个例子中,我使用了一个虚拟函数来实现这一点,虽然可能有更优雅的方法。是的,这正是我想要的,现在它工作得很好,非常感谢much@Mark勒索谢谢你的帮助,这种方法使噪音降到了最低,但是画面的颜色却以一种奇怪的方式出现了,我不知道为什么?!你说的框架颜色是什么意思?您已经转换为灰度,执行了图像减法,然后对结果进行阈值化,因此结果
是一个二值图像,对应于图像中任何显著的强度变化。之后,我必须将帧返回到RGB,因此我使用了cv