持续变化背景检测:累积残差法
编写时间:2023-08
监控视频的背景建模通常假设背景是静止的。但真实场景里有一些东西虽然一直在动,却不属于前景——扶梯在运行、电子告示牌在滚动文字、喷泉在喷水。它们不应该触发"运动检测",但又确实在变化。这个模块就是处理这个边界情况。
问题定义
核心判断标准不是"有没有变化",而是变化是否持续。一个人走过,残差只在那几帧;扶梯一直在转,残差会在几十上百帧里持续累积。
算法思路
累积残差
对固定长度的帧窗口,逐帧计算相邻帧差并累加:
二值化与后处理
累积残差图拿到后,走一条标准的 mask 生成管线:
消除前景干扰
人走动也会产生残差,但人的残差是局部的、不会在同一个像素位置持续整整 100 帧。两种辅助手段:
| 手段 | 作用 | 代价 |
|---|---|---|
| 人脸/人体检测 | 剔除含人区域的残差 | 需要额外模型 |
| 边缘检测辅助 | 利用边缘一致性确认区域 | 对纹理弱区效果有限 |
实际效果上,因为背景运动(扶梯、告示牌)的位置非常固定,即使不加人脸检测,100 帧的累积也已经能把前景残差稀释到阈值以下。人脸检测更多是兜底。
参数选择
| 参数 | 值 | 直觉 |
|---|---|---|
| 累积帧数 | 100 | 足够让前景残差被稀释,背景残差充分累积 |
| 残差阈值 | 10/255 | 低于此的帧间变化视为噪声(压缩伪影、传感器噪点) |
| 二值化阈值 | 70/255 | 累积残差归一化后,多高算"持续变化" |
| 连通面积阈值 | 500 px | 过滤零星噪点聚集 |
参数调的思路是:累积帧数决定"持续"的定义严格程度;二值化阈值决定对"变化剧烈程度"的敏感度;面积阈值是最后的安全网,清理碎片。
边界与局限
- 不适合短时场景切换。如果背景变化本身只持续几秒就停了(比如临时施工),100 帧窗口可能捕捉不到。
- 依赖固定相机。相机抖动会导致全图残差异常升高,需要先做稳像或全局运动补偿。
- 光照突变(开关灯、闪电)会在残差图上制造大面积的假阳性。可以考虑在残差计算前做光照归一化。
- 缓慢变化的背景(如日落时分的光影移动)帧间残差很小,可能需要更长的累积窗口或更低的残差阈值。
工程判断
这个模块属于"小而有用的算法笔记"。它不涉及深度学习,也不用 GPU,核心是一个观察:持续性和规律性可以把背景变化和前景运动分开。累积残差本质上是把时间维度的信息折叠到一张图里,然后用经典图像处理手段(阈值、形态学、连通域)做决策。
在工程上,这种轻量级方法很适合作为监控视频分析的前置步骤——先把扶梯和告示牌区域标出来,后续的运动检测、目标跟踪、异常检测就可以直接跳过这些区域,减少误报。