基于自适应背景差分的实时多目标跟踪系统
项目简介
本项目是一个基于 MATLAB 开发的计算机视觉应用系统,专注于视频序列中的多目标检测与跟踪任务。系统通过自适应背景差分技术提取前景运动目标,结合卡尔曼滤波(Kalman Filter)与匈牙利算法(Hungarian Algorithm),实现了对多个运动目标的稳定跟踪。
该代码专为稀疏目标环境(通常少于8个目标)设计,具备自动生成测试数据的功能,无需外部视频源即可直接运行演示。它适用于低密度的交通流监控、室内安防监控等场景,是学习和研究视觉跟踪算法的理想参考案例。
功能特性
- 全自动演示流程:内置合成视频生成器,若无输入文件会自动生成包含模拟光照变化和噪声的测试视频。
- 自适应前景检测:采用高斯混合模型(GMM)进行背景建模,能够适应环境光照的缓慢变化。
- 形态学噪声处理:通过开运算、闭运算和孔洞填充,有效去除背景噪点并修复目标空洞。
- 鲁棒的轨迹跟踪:集成卡尔曼滤波器进行运动状态预测,保证了目标被遮挡或短暂丢失时的轨迹平滑性。
- 数据关联算法:使用匈牙利指派算法解决检测框与现有轨迹的匹配问题。
- 生命周期管理:具备完整的轨迹创建、更新、老化及删除机制,自动滤除不稳定的虚假轨迹。
- 结果可视化与保存:实时显示带有ID和边界框的跟踪结果,并将处理后的视频保存到本地。
系统要求
- MATLAB (建议 R2016a 及以上版本)
- Computer Vision Toolbox (必须安装,用于前景检测器和卡尔曼滤波函数)
使用方法
- 启动 MATLAB 并将当前目录设置为项目所在文件夹。
- 在命令窗口输入
main 并回车,或直接运行 main 函数。 - 首次运行:系统会自动调用内部函数生成名为
input_synthetic_demo.avi 的模拟视频文件。 - 运行中:会弹出一个视频播放窗口,实时展示多目标跟踪的效果,目标会被黄色边框和ID标记。
- 运行结束:处理完成后,跟踪结果将保存为
output_tracking_result.avi。
核心算法实现细节
本项目的核心逻辑包含四个主要步骤,严格按照代码中的执行流程设计:
1. 运动目标检测 (Detection)
系统首先利用 vision.ForegroundDetector 对象对当前帧进行处理。该检测器基于高斯混合模型(GMM),利用前50帧初始化背景模型,并将前景概率低的像素识别为背景。
- 背景差分:计算当前帧与背景模型的差异,生成二值前景掩码。
- 形态学滤波:
*
开运算:去除细小的噪点(孤立白点)。
*
闭运算:融合目标内部的裂缝,使目标更加连通。
*
孔洞填充:填充目标内部封闭的黑色区域,确保目标实心。
- 连通域分析:使用
vision.BlobAnalysis 提取前景块的面积、中心点和边界框,并过滤掉面积小于400像素的微小噪声。
2. 目标跟踪预测 (Prediction)
在获得新的检测结果之前,系统首先根据上一帧的状态预测当前位置。
- 遍历所有现存的轨迹。
- 使用 卡尔曼滤波器 (Kalman Filter) 的
predict 方法,基于恒定速度模型估算目标在当前帧的中心位置。 - 根据预测的中心点更新轨迹的边界框(Bounding Box),此时尚未结合实际观测值。
3. 数据关联 (Data Association)
为了将当前的检测结果(观测值)与现有的轨迹(预测值)对应起来,代码实现了以下逻辑:
- 代价矩阵计算:计算每一条现有轨迹的预测中心与每一个新检测到的目标中心之间的欧氏距离。
- 匈牙利算法匹配:调用
assignDetectionsToTracks 函数,基于最小化总距离的原则进行指派。 - 阈值判定:设置未关联代价阈值为 20。如果距离过大,则认为匹配失败,防止错误关联。
4. 轨迹状态管理 (Track Management)
根据关联结果,系统将目标分为三类进行处理:
* 使用当前检测到的实际位置修正卡尔曼滤波器(
correct 方法)。
* 更新边界框、增加“存活时长”(Age)和“总可见次数”。
* 重置“连续丢失计数”为0。
* 当出现无法匹配现有轨迹的新检测框时,系统判定为新目标出现。
* 初始化一个新的卡尔曼滤波器(配置为恒定速度模型)。
* 分配新的唯一ID,并初始化轨迹结构体。
* 对于预测了位置但未在画面中检测到的目标(可能被遮挡或漏检),增加其“连续丢失计数”。
5. 轨迹清理与可视化
- 轨迹删除:代码包含特定的清理逻辑,当满足以下任一条件时删除轨迹:
* 目标连续丢失超过 20 帧(认为已离开画面)。
* 目标存活时间很短且出现了连续丢失(判定为噪声轨迹)。
- 可靠性过滤:在可视化输出时,只有“总可见次数”超过 4 次的轨迹才会被绘制出来。这避免了屏幕上出现瞬间闪烁的误检框。
- 信息叠加:在视频帧上绘制黄色的边界框、目标ID以及当前帧计数。
辅助功能说明
代码末尾包含一个名为 createSyntheticVideo 的辅助函数,用于在缺乏真实视频源时生成测试数据。
- 环境模拟:生成 300 帧、分辨率 640x480 的视频,拥有缓慢变化的灰度背景(模拟光照波动)。
- 目标模拟:创建 3 个不同颜色、大小和速度的矩形目标,它们在画面内移动并在碰到边界时反弹。
- 噪声模拟:在每一帧中添加椒盐噪声(Salt & Pepper),以测试算法的鲁棒性。
系统局限性
- 目标数量限制:当画面中同时出现的目标数量超过 8 个时,计算资源的分配和遮挡处理的难度增加,可能导致跟踪ID频繁切换或丢失。
- 适用场景:仅适用于摄像机静止的场景(背景相对固定)。如果摄像机移动,背景差分算法将失效。