使用imagecolorat()进行运动检测

时间:2011-03-09 20:37:31

标签: php security gd

我已经设置了安全摄像头,我正在比较1分钟的图像批次以检查是否有任何动作。我在每张图像之间检查了10个坐标。如果任何像素与前一个图像不匹配,则会触发警告消息。

问题是,它运作得很好。

逻辑基本上是imagecolorat()大于或小于之前imagecolorat()的10%差异,它会触发。所以,如果一个云来到房子,它会触发。基本上任何光线的变化都会触发它。所以,我已经将阈值从10%提高到30%并触发更少,但我现在担心的是,如果我移动过去,那么就不会检测出真实的动作。

注意:我使用的是imagecolorat()的原始输出,而不是RGB值。我不确定这是否会产生影响。

1 个答案:

答案 0 :(得分:5)

你正在寻找更大的不连续性 - 噪音和缓慢变化之类的东西应该打折扣(除非这种运动检测适用于非常缓慢移动的小东西,比如花园侏儒)。

因此,在图像相减之前进行直方图均衡或类似操作以考虑光的全局偏移,并在差分之前进行一些滤波/边缘增强以增强变化。我认为使用更多的图像会比仅仅10点更好。

直方图均衡需要在图像中循环,并为每个亮度值计数分档 - 因此您有一个结果数据集,表明一组色调范围中有多少像素。换句话说,假设您分成16个区间 - 具有灰度值的像素(或者,HSB模型中的亮度),其值为0..15(假设此通道中的8位图像)都是在bin 1.然后你出去计算一系列线性伸展以应用于每个bin,使其占据与其总体成比例的输出范围。因此,如果所有像素都在0 .. 15 bin中,您只需将所有像素乘以16即可将它们拉伸。目标是均衡图像的直方图是平坦的 - 每个区域中的像素数量相等。

边缘增强可以通过应用Sobel滤波器来完成。