基于Lucas-Kanade算法的光流场计算与目标跟踪系统
项目简介
本项目实现了一个基于经典的 Lucas-Kanade (LK) 稀疏光流算法的视频运动估计与目标跟踪系统。系统不完全依赖 MATLAB 视觉工具箱的高层跟踪函数,而是通过底层代码编写,详细展示了光流计算的核心数学原理,包括图像预处理、时空梯度计算、光流方程组构建及最小二乘法求解。
该系统具备良好的鲁棒性,能够自动加载本地视频文件进行分析;若未找到指定视频源,则会自动生成包含运动目标的合成视频数据进行演示。
主要功能特性
- 双模式视频源支持:程序优先尝试加载真实的交通监控视频;若文件不存在,则自动触发“合成数据模式”,生成包含正弦运动轨迹圆点和背景纹理的模拟视频流。
- 图像预处理流水线:实现了图像的灰度化转换以及基于高斯核的平滑滤波,有效降低图像高频噪声对微分计算的影响。
- 底层梯度计算:通过卷积操作手动计算图像在 X、Y 空间方向以及 时间 T 维度上的偏导数。
- LK 光流核心解算器:
* 基于局部窗口假设(光流恒定),构建超定方程组。
* 利用结构张量(Structure Tensor)和最小二乘法求解像素位移。
* 包含特征值检测机制,自动剔除处于平坦区域(不可逆或条件数差)的特征点。
- 长期特征跟踪与补录:支持特征点的连续坐标更新,并在跟踪点数量不足时自动重新检测强角点进行补充。
- 实时动态可视化:在视频画面上实时绘制特征点位置(绿色)和代表运动速度/方向的光流矢量箭头(红色)。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
- Computer Vision Toolbox(计算机视觉工具箱)- 主要用于视频读取及初始角点检测
实现细节与算法分析
本项目主要在 main 函数及其子函数中实现了完整的处理逻辑:
1. 初始化与数据源管理
系统首先进行环境清理。在加载视频源时采用了
try-catch 直结构:
- 真实模式:尝试读取
visiontraffic.avi。 - 合成模式:若读取失败,初始化参数以生成 100 帧的合成动画,该动画包含一个按正弦轨迹运动的圆点和随机分布的背景方块,用于验证光流跟踪的准确性。
2. 特征点初始化
虽然光流计算是手动实现的,但为了获得高质量的初始跟踪目标,系统利用了 Shi-Tomasi 角点检测算法(
detectMinEigenFeatures)来选取纹理最丰富的点,并使用
selectStrongest 筛选出质量最高的特征点(默认为前 200 个)。
3. 光流计算核心循环
在每一帧的处理中,算法执行以下关键步骤:
构造一个基于指定 Sigma 值的高斯核,对当前帧和下一帧进行卷积滤波,平滑图像以保证梯度的稳定性。
- 时空梯度计算 (
computeGradients):
*
空间梯度 (Ix, Iy):使用平滑后的中心差分算子(核大小为 3x3,权重为
[-1 0 1]/6)对图像进行卷积,分别提取水平和垂直方向的梯度信息。
*
时间梯度 (It):采用简单的帧差法,即下一帧减去当前帧,获得亮度随时间的变化量。
- LK 方程求解 (
solveLKOpticalFlow):
这是本项目的核心算法函数。对于每一个特征点:
1.
窗口提取:以特征点为中心,截取固定大小(如 15x15)的局部窗口。
2.
边界检查:若窗口超出图像边界,则标记该点失效。
3.
构建方程:将窗口内的梯度数据拉伸为向量,构建矩阵 $A = [I_x, I_y]$ 和向量 $b = -I_t$。
4.
计算结构张量:计算 $M = A^T A$。
5.
可解性判断:计算张量 $M$ 的最小特征值。如果特征值过小(小于 1e-4),说明该邻域缺乏纹理变化(如平坦区域),无法可靠求解光流,标记失效。
6.
求解位移:使用 MATLAB 的左除运算符(最小二乘法)求解 $v = M setminus (A^T b)$,得到速度矢量 $(u, v)$。
4. 跟踪更新与维护
- 坐标更新:根据计算出的 $(u, v)$ 矢量,将特征点坐标更新为 $x_{new} = x_{old} + u, y_{new} = y_{old} + v$。
- 状态过滤:仅保留计算状态标记为“成功”的点,移除溢出边界或处于平坦区域的点。
- 特征补录:每帧检查当前有效跟踪点的数量,若低于最大点数的一半,则在当前帧重新运行角点检测算法,补充新的特征点加入跟踪列表。
5. 可视化模块
利用 MATLAB 图形句柄(Handle Graphics)机制实现高效动画更新:
- 使用
imshow 更新背景图像。 - 使用
plot 更新特征点坐标(绿色十字)。 - 使用
quiver 绘制光流矢量图(红色箭头),箭头的长度和方向直观反映了物体的运动状态。
使用方法
- 将代码保存为 m 文件。
- 确保 MATLAB 路径中包含所需的工具箱。
- 直接运行主函数。
- 程序将弹出一个窗口显示跟踪效果。如果你没有
visiontraffic.avi 文件,程序将自动演示合成的移动圆点跟踪效果。 - 关闭图形窗口即可其停止运行。