Mean-Shift 算法综合资料库与目标跟踪 MATLAB 实现
项目简介
本项目是一个专注于 Mean-Shift(均值漂移)算法的综合性学习与开发平台。旨在为计算机视觉领域的研究人员和开发者提供理论与实践并重的资源。项目不仅整合了阐述算法数学原理、密度梯度估计及收敛性证明的理论资料(技术文档、PPT、学术论文),更提供了一套基于 MATLAB 开发的完整目标跟踪工程实现。
该工程代码展示了如何利用颜色直方图构建目标模型,并通过 Mean-Shift 迭代寻找概率密度函数的局部峰值,从而实现对视频序列中移动目标的实时跟踪。
功能特性
- 双模式输入处理:支持从本地文件系统读取多种格式的视频文件(.mp4, .avi, .mov, .wmv),同时具备容错机制,若未选择视频则自动生成合成测试视频进行演示。
- 交互式目标初始化:提供图形用户界面,允许用户通过鼠标在第一帧画面中手动框选感兴趣的目标区域(ROI)。
- 鲁棒的跟踪算法:基于颜色特征和核密度估计,利用 Epanechnikov 核函数加权,能够适应目标的变形和部分遮挡。
- 智能边界修正:自动调整用户选框尺寸为奇数像素,并在选框过小时重置为默认区域,确保算法计算的稳定性。
- 实时可视化反馈:在跟踪过程中实时显示目标边界框、中心运动轨迹以及当前帧数、迭代次数和位置坐标信息。
- 高效的代码结构:采用模块化设计,包含边界填充处理、直方图索引映射及概率密度计算等独立功能模块。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
- Computer Vision Toolbox(虽然核心算法手写,但视频读取可能需要相关支持)
使用方法
- 启动程序:运行主函数(main)。
- 选择视频:程序启动后会弹出文件选择对话框。
* 若选择视频文件,程序将加载该视频。
* 若点击“取消”,程序将自动进入
合成视频模式,生成100帧的动态模拟图像进行演示。
- 目标框选:在弹出的图形窗口中,第一帧图像会静止显示。使用鼠标拖拽框选想要跟踪的目标物体,双击左键或按 Enter 键确认。
- 观察跟踪:程序开始逐帧处理,红色矩形框将跟随目标移动,绿色线条记录目标的运动轨迹。
核心算法实现详解
主程序(main)的实际逻辑流程与关键技术细节如下:
1. 环境初始化与输入控制
程序首先清理工作区环境。在获取输入时,采用
uigetfile 获取用户指定的视频路径。代码中包含了一个特殊的逻辑分支:如果用户取消了文件选择(即
fileName 为 0),系统会将
useSynthetic 标志设为 true,并定义虚拟视频的高宽(480x640)和总帧数,这使得代码在没有素材的情况下也能运行调试。
2. 目标模型初始化
- ROI 获取:通过
getrect 获取用户交互的矩形坐标。为了配合中心对称的核函数计算,代码强制将矩形的宽和高调整为最接近的奇数(floor(x/2)*2 + 1)。 - 异常处理:包含一个安全检查,如果选框尺寸小于 5x5 像素,系统会将其重置为屏幕中心的默认大小(41x41),防止算法崩溃。
- 核函数准备:调用
createEpanechnikovKernel 预先生成与 ROI 同尺寸的核掩膜,该核函数通常是一个中心高、边缘低的抛物面结构($k(x) = 1 - x$),用于赋予目标中心像素更高的权重。 - 目标 PDF 计算:程序将 ROI 图像从 RGB 空间映射到量化索引空间(16x16x16 级),结合核函数计算目标的加权颜色直方图(即目标概率密度函数 $q_u$)。
3. Mean-Shift 迭代跟踪循环
对于视频的每一帧,算法执行以下核心步骤:
- 候选区域提取:以一帧的中心位置为基准,提取候选区域图像。代码使用
getSubImageWithPadding 函数,确保当目标移动到图像边缘时,超出边界的部分会被填充(通常为0),保证取出的矩阵尺寸始终不变。 - 权重图计算(Weight Map):
* 计算候选区域的加权直方图 $p_u$。
* 基于巴氏系数(Bhattacharyya coefficient)原理,计算每个颜色分量的权重 $w_i = sqrt{q_u / p_u}$。为了数值稳定性,分母 $p_u$ 加上了一个极小值(1e-10)。
* 通过
mapWeightsBack 将颜色权重映射回像素空间,得到像素级的权重图。
* 利用权重图计算新的质心位置(Mean Shift)。公式体现为计算权重图中所有像素坐标的加权平均值。
* 计算当前中心与新质心的位移偏移量 ($dx, dy$)。
* 更新当前跟踪框的中心坐标,并进行边界限制,防止移除图像范围。
* 计算移动距离
dist_move。
*
循环终止条件:当迭代次数达到最大值(15次)或中心移动距离小于阈值(epsilon = 0.5)时,停止本帧迭代。
4. 轨迹记录与可视化
代码使用
rectangle 对象绘制红色的跟踪框,使用
plot 对象绘制绿色的历史轨迹。为了提高绘图效率,代码在循环中通过
set 函数更新图形对象的
Position、
XData/YData 和
String 属性,而不是每次都重新创建对象,并通过
drawnow limitrate 控制刷新频率。
关键函数说明
- generateSyntheticFrame(推测存在):当未选择视频时调用,用于生成测试用的合成图像帧。
- getSubImage:基础的图像裁剪函数,不处理边界溢出。
- getSubImageWithPadding:增强型图像裁剪函数,当请求区域超出图像边界时,自动补零(黑色填充)并返回有效的掩膜(mask),这对保持矩阵尺寸一致性至关重要。
- getIndexMap:将 RGB 三通道颜色值映射为一个单通道的索引值,用于构建直方图。
- computePDF:结合颜色索引图和 Epanechnikov 核函数,计算直方图并归一化,得到概率密度函数。
- mapWeightsBack:反向投影步骤,将直方图计算出的 Bin 权重重新分配给图像中的对应像素。
- createEpanechnikovKernel:构建核函数矩阵,用于空间加权,降低背景像素对跟踪的影响。