经典视觉跟踪算法的MATLAB实现
经典视觉跟踪算法的MATLAB实现
一、光流法(Lucas-Kanade)
原理:通过像素亮度恒定假设计算相邻帧间的运动矢量场
应用:运动目标检测、视频压缩
核心参数:窗口大小、金字塔层数、迭代次数
%% 光流法实现(Lucas-Kanade)
clear; clc; close all;
% 读取视频
video = VideoReader('input.mp4');
frame = readFrame(video);
prevGray = rgb2gray(frame);
% 初始化参数
lk_params = struct('WindowSize',15,'MaxLevel',2,'TermCrit',{1e-5,0.03});
points = detectHarrisFeatures(prevGray);
% 创建视频播放器
player = vision.VideoPlayer('Name','Optical Flow');
while hasFrame(video)
frame = readFrame(video);
gray = rgb2gray(frame);
% 计算光流
[nextPts, status] = estimateFlow(opticalFlowLK(prevGray), points.Location);
% 更新特征点
points = points(status);
% 可视化
imshow(frame); hold on;
plot(nextPts(:,1), nextPts(:,2),'r*');
drawnow;
prevGray = gray;
end
二、MeanShift跟踪
原理:通过密度梯度上升寻找概率密度峰值
优势:无需预设目标数量,适合非刚性目标
关键参数:带宽、相似度阈值
%% MeanShift跟踪实现
function meanShiftTrack()
video = VideoReader('input.mp4');
frame = readFrame(video);
% 初始化目标区域
rect = [100,100,50,50]; % [x,y,width,height]
hsv = rgb2hsv(frame);
targetHist = imhist(hsv(:,:,1)); % 使用色调直方图
while hasFrame(video)
frame = readFrame(video);
hsv = rgb2hsv(frame);
% 计算候选区域直方图
candidateHist = computeCandidateHist(frame, rect);
% 计算相似度
similarity = bhattacharyyaCoeff(targetHist, candidateHist);
% 更新目标位置
[newRect, ~] = meanShiftUpdate(rect, similarity);
% 显示结果
imshow(frame);
rectangle('Position',newRect,'EdgeColor','r');
drawnow;
end
end
function newRect = meanShiftUpdate(rect, similarity)
% MeanShift迭代更新
threshold = 1e-5;
maxIter = 10;
for i = 1:maxIter
% 计算梯度
gradient = computeGradient(rect);
% 更新位置
rect = rect + gradient;
% 检查收敛
if norm(gradient) < threshold
break;
end
end
newRect = rect;
end
三、CamShift跟踪
原理:MeanShift的改进版,支持窗口自适应缩放
改进点:动态调整搜索窗口大小
参数优化:颜色空间选择、窗口缩放因子
%% CamShift实现
function camShiftTrack()
video = VideoReader('input.mp4');
frame = readFrame(video);
% 初始化参数
hsv = rgb2hsv(frame);
roi = [100,100,50,50];
targetHist = imhist(hsv(:,:,1));
while hasFrame(video)
frame = readFrame(video);
hsv = rgb2hsv(frame);
% 计算相似度
candidateHist = computeCandidateHist(frame, roi);
similarity = bhattacharyyaCoeff(targetHist, candidateHist);
% CamShift迭代
[newRoi, converged] = camShiftIterate(roi, similarity);
% 窗口缩放
if similarity > 0.8
newRoi = scaleWindow(newRoi, 1.1);
else
newRoi = scaleWindow(newRoi, 0.9);
end
% 显示结果
imshow(frame);
rectangle('Position',newRoi,'EdgeColor','g');
drawnow;
end
end
四、卡尔曼滤波跟踪
原理:状态空间模型预测+测量更新
应用:目标运动预测、传感器融合
关键矩阵:状态转移矩阵、观测矩阵
%% 卡尔曼滤波实现
dt = 0.1; % 时间间隔
A = [1 dt; 0 1]; % 状态转移矩阵
H = [1 0]; % 观测矩阵
Q = diag([0.1,0.01]); % 过程噪声
R = 10; % 测量噪声
% 初始化
x = [0;0]; % 初始状态 [x,y]
P = eye(2); % 初始协方差
video = VideoReader('input.mp4');
while hasFrame(video)
frame = readFrame(video);
% 预测
x_pred = A*x;
P_pred = A*P*A' + Q;
% 更新
z = [frame(100,100,1); frame(100,101,1)]; % 示例测量值
K = P_pred*H'/(H*P_pred*H' + R);
x = x_pred + K*(z - H*x_pred);
P = (eye(2)-K*H)*P_pred;
% 显示结果
imshow(frame);
plot(x(1),x(2),'bo');
drawnow;
end
五、背景差分法
原理:背景模型与当前帧差异检测
改进方向:自适应背景更新、形态学处理
%% 背景差分法
video = VideoReader('input.mp4');
background = readFrame(video);
while hasFrame(video)
frame = readFrame(video);
gray = rgb2gray(frame);
bgGray = rgb2gray(background);
% 差分计算
diff = imabsdiff(gray, bgGray);
thresh = graythresh(diff)*255;
bw = imbinarize(diff, thresh/255);
% 形态学处理
se = strel('disk',3);
bw = imopen(bw, se);
% 更新背景
alpha = 0.05;
background = alpha*frame + (1-alpha)*background;
imshow(bw); title('运动目标检测');
drawnow;
end
六、粒子滤波跟踪
原理:蒙特卡洛采样估计目标状态
优势:处理非高斯噪声、多模态分布
参数设置:粒子数、状态维度、重采样策略
%% 粒子滤波实现
numParticles = 1000;
stateDim = 4; % [x,y,vx,vy]
% 初始化粒子
particles = rand(numParticles, stateDim)*100;
weights = ones(numParticles,1)/numParticles;
video = VideoReader('input.mp4');
while hasFrame(video)
frame = readFrame(video);
% 预测
particles = predictParticles(particles, 0.1);
% 更新
weights = updateWeights(particles, frame);
% 重采样
[particles, weights] = resampleParticles(particles, weights);
% 估计目标位置
estimatedState = mean(particles,1);
imshow(frame);
plot(estimatedState(1), estimatedState(2),'r*');
drawnow;
end
推荐源码 经典的视觉跟踪算法的MATLAB代码 www.youwenfan.com/contentcng/50672.html
七、算法对比与选型建议
| 算法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 光流法 | 精确运动估计 | 计算量大,需纹理信息 | 视频压缩、运动分析 |
| MeanShift | 无需训练,实时性好 | 对尺度变化敏感 | 非刚性目标跟踪 |
| CamShift | 支持窗口自适应 | 遮挡处理不足 | 旋转/缩放目标跟踪 |
| 卡尔曼滤波 | 计算效率高 | 线性系统假设 | 直线运动预测 |
| 粒子滤波 | 处理非高斯噪声 | 粒子退化问题 | 复杂环境下的多模态跟踪 |
八、完整工程文件结构
VisualTracking/
├── data/
│ ├── input.mp4
│ └── test_videos/
├── src/
│ ├── optical_flow.m
│ ├── meanshift.m
│ └── camshift.m
├── results/
│ ├── trajectories/
│ └── performance/
└── README.md

浙公网安备 33010602011771号