【发布时间】:2012-05-24 11:50:59
【问题描述】:
我正在尝试使用帧差异检测运动。如果有动议,我会进入另一个方法,如果没有,我不会进入那个方法。问题是当我使用 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
}
【问题讨论】:
-
没有办法完全消除噪音您应该尝试采用与“非常低的变化”一起使用的方法——例如看看噪声的平均值是多少,然后所有低于平均值的帧差异都被视为由于噪声而发生的。都高于平均水平,如果你愿意,可以称之为“高变化”,你会假设图像中存在除噪声之外的影响,然后去计算所需的东西。
标签: c++ image-processing opencv