使用imagecolorat()进行运动检测

Cit*_*zen 2 php security gd

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

问题是,它运作得很好.

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

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

Mik*_*keb 5

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

因此,在图像减法之前做直方图均衡或类似事项以考虑光的全局偏移,并在差分之前进行一些滤波/边缘增强以增强变化.使用更多的图像会比我想的更好,而不仅仅是10分.

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

可以通过应用Sobel滤波器简单地完成边缘增强.