经典视觉跟踪算法的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
posted @ 2025-10-16 16:14  吴逸杨  阅读(16)  评论(0)    收藏  举报