在MATLAB的 Computer Vision Toolbox 中,目标检测与跟踪的传统方法(非深度学习)基于 手工设计特征统计学习/滤波算法,无需大规模标注数据,适合简单场景(如刚性目标、低复杂度背景)。这些方法虽泛化能力不及深度学习,但速度快、资源消耗低,至今仍是工业实时场景的重要选择。

一、传统目标检测方法(基于特征与分类器)

传统目标检测通过手工设计特征(如纹理、形状、颜色)描述目标,结合分类器(如AdaBoost、SVM)区分目标与背景,核心是“特征提取+分类决策”。

1. Haar级联检测(Haar Cascade Detection)

原理
基于 Haar 小波特征(描述图像局部明暗变化,如人脸的眼睛区域比脸颊暗),通过 AdaBoost 算法筛选强特征,再构建级联分类器(多阶段筛选,快速排除非目标区域),实现高效检测。

工具箱实现

  • 预训练模型:vision.CascadeObjectDetector(内置人脸、上半身等检测器)。
  • 自定义训练:trainCascadeObjectDetector(训练自定义目标检测器)。

适用场景:刚性目标(如人脸、车牌、特定工业零件),背景简单、目标姿态变化小的场景。

示例代码(检测人脸)

% 1. 加载预训练的Haar级联人脸检测器
faceDetector = vision.CascadeObjectDetector();  % 默认检测正面人脸

% 2. 读取图像并检测
I = imread('group_photo.jpg');  % 包含多个人脸的图像
bboxes = step(faceDetector, I);  % 输出人脸边界框 [x, y, width, height]

% 3. 标注检测结果
I_detected = insertObjectAnnotation(I, 'rectangle', bboxes, 'Face');

% 4. 显示结果
figure; imshow(I_detected); title('Haar级联人脸检测');

自定义训练示例(检测特定零件)

% 训练集路径(包含正样本图像和负样本图像)
positiveImagesDir = 'dataset/positive';  % 仅包含目标的图像
negativeImagesDir = 'dataset/negative';  % 不包含目标的背景图像

% 训练检测器(保存为XML文件)
trainCascadeObjectDetector('part_detector.xml', ...
    positiveImagesDir, negativeImagesDir, ...
    'FalseAlarmRate', 0.1, ...  每级分类器的误报率
    'NumCascadeStages', 10);    % 级联级数(越多精度越高,速度越慢)

% 加载自定义检测器并使用
partDetector = vision.CascadeObjectDetector('part_detector.xml');

优缺点

  • 优点:速度快(毫秒级)、轻量级(适合嵌入式)。
  • 缺点:对目标姿态(如侧脸)、光照变化敏感,复杂背景下误检率高。
2. HOG+SVM检测(方向梯度直方图+支持向量机)

原理

  • HOG特征:通过统计图像局部区域的梯度方向分布,描述目标的边缘和纹理(如行人的轮廓),对光照和小形变不敏感。
  • SVM分类器:通过支持向量机对HOG特征进行分类,区分目标与背景。

工具箱实现

  • 特征提取:extractHOGFeatures(提取HOG特征)。
  • 分类器训练:fitcsvm(训练SVM分类器)。
  • 滑动窗口检测:结合滑动窗口遍历图像,用SVM判断窗口是否为目标。

适用场景:中等复杂度目标(如行人、汽车),目标有明显轮廓特征的场景。

示例代码(行人检测)

% 1. 准备训练数据(正样本:行人图像;负样本:背景图像)
positiveDir = 'dataset/pedestrians';
negativeDir = 'dataset/background';
positiveImages = imageDatastore(positiveDir);
negativeImages = imageDatastore(negativeDir);

% 2. 提取HOG特征(统一输入尺寸为128×64,适合行人)
hogFeatureSize = length(extractHOGFeatures(rgb2gray(read(positiveImages,1)), [128,64]));
numPositive = length(positiveImages.Files);
numNegative = length(negativeImages.Files);

% 正样本特征
positiveFeatures = zeros(numPositive, hogFeatureSize);
for i = 1:numPositive
    img = rgb2gray(read(positiveImages, i));
    img = imresize(img, [128,64]);
    positiveFeatures(i,:) = extractHOGFeatures(img);
end

% 负样本特征
negativeFeatures = zeros(numNegative, hogFeatureSize);
for i = 1:numNegative
    img = rgb2gray(read(negativeImages, i));
    img = imresize(img, [128,64]);
    negativeFeatures(i,:) = extractHOGFeatures(img);
end

% 3. 训练SVM分类器(标签:1=目标,-1=背景)
trainingFeatures = [positiveFeatures; negativeFeatures];
trainingLabels = ones(numPositive,1);
trainingLabels = [trainingLabels; -ones(numNegative,1)];
svmClassifier = fitcsvm(trainingFeatures, trainingLabels, 'KernelFunction', 'RBF');

% 4. 滑动窗口检测测试图像
testImage = imread('street.jpg');
testImageGray = rgb2gray(testImage);
[rows, cols] = size(testImageGray);

% 滑动窗口参数(步长32,窗口尺寸128×64)
windowSize = [128,64];
stepSize = 32;
bboxes = [];

% 遍历图像
for y = 1:stepSize:rows - windowSize(1) + 1
    for x = 1:stepSize:cols - windowSize(2) + 1
        % 提取窗口区域
        window = testImageGray(y:y+windowSize(1)-1, x:x+windowSize(2)-1);
        % 提取HOG特征
        features = extractHOGFeatures(window);
        % SVM预测
        if predict(svmClassifier, features) == 1
            bboxes = [bboxes; x, y, windowSize(2), windowSize(1)];
        end
    end
end

% 5. 非极大值抑制(去除重叠框)
bboxes = selectStrongestBbox(bboxes, 0.5);  % 重叠阈值0.5

% 6. 标注结果
I_detected = insertObjectAnnotation(testImage, 'rectangle', bboxes, 'Pedestrian');
figure; imshow(I_detected); title('HOG+SVM行人检测');

优缺点

  • 优点:比Haar级联更鲁棒(对光照、小形变不敏感),适合行人等中等复杂度目标。
  • 缺点:滑动窗口效率低(比Haar慢),对严重遮挡敏感。
3. 模板匹配(Template Matching)

原理
通过计算待检测图像与目标模板(已知目标图像)的相似度(如归一化互相关),定位与模板最相似的区域。

工具箱实现normxcorr2(归一化互相关,计算相似度)。

适用场景:目标尺寸、姿态固定(如印刷品logo、特定型号零件),无遮挡的简单场景。

示例代码(检测固定模板目标)

% 1. 准备模板和待检测图像
template = imread('logo_template.jpg');  % 目标模板(如公司logo)
templateGray = rgb2gray(template);
I = imread('product.jpg');  % 包含目标的图像
IGray = rgb2gray(I);

% 2. 计算归一化互相关(相似度)
corrMap = normxcorr2(templateGray, IGray);

% 3. 阈值筛选(保留相似度>0.8的区域)
threshold = 0.8;
maxCorr = max(corrMap(:));
if maxCorr > threshold
    [y, x] = find(corrMap == maxCorr);
    % 计算边界框(模板尺寸)
    bbox = [x - size(templateGray,2) + 1, y - size(templateGray,1) + 1, ...
            size(templateGray,2), size(templateGray,1)];
    % 标注结果
    I_detected = insertObjectAnnotation(I, 'rectangle', bbox, 'Logo');
    figure; imshow(I_detected); title('模板匹配检测结果');
else
    disp('未检测到目标');
end

优缺点

  • 优点:实现简单,无需训练,适合固定目标。
  • 缺点:对目标旋转、缩放、光照变化极敏感,实用性有限。

二、传统目标跟踪方法(基于滤波与特征匹配)

传统目标跟踪通过初始帧手动框选目标,后续帧基于特征匹配或运动模型预测目标位置,核心是“预测+更新”。

1. 均值漂移跟踪(Mean Shift Tracking)

原理
基于目标的颜色直方图(如HSV颜色分布),在后续帧中通过均值漂移算法寻找与目标颜色分布最相似的区域,实现跟踪。

工具箱实现vision.HistogramBasedTracker(封装均值漂移算法)。

适用场景:目标颜色特征明显、背景颜色差异大、无剧烈运动的场景(如跟踪红色小球)。

示例代码

% 1. 打开视频(或摄像头)
video = VideoReader('ball_video.mp4');

% 2. 读取第一帧,手动框选跟踪目标(如红色小球)
frame = readFrame(video);
figure; imshow(frame); title('框选跟踪目标');
bbox = getrect;  % 手动绘制边界框

% 3. 初始化均值漂移跟踪器(基于颜色直方图)
tracker = vision.HistogramBasedTracker;
initialize(tracker, frame, bbox);

% 4. 逐帧跟踪
while hasFrame(video)
    frame = readFrame(video);
    [bbox, isTracked] = step(tracker, frame);  % 更新目标位置
    
    % 标注跟踪结果
    if isTracked
        frame = insertObjectAnnotation(frame, 'rectangle', bbox, 'Target');
    else
        frame = insertText(frame, [10,10], '跟踪丢失', 'BoxColor', 'red');
    end
    imshow(frame); drawnow;
end

优缺点

  • 优点:计算量小(速度快),对目标旋转、尺度变化有一定适应性。
  • 缺点:依赖颜色特征,目标与背景颜色接近时易丢失;不适应快速运动。
2. 卡尔曼滤波跟踪(Kalman Filter Tracking)

原理
通过运动模型(如匀速直线运动)预测目标位置,结合观测模型(如目标中心坐标)更新预测,减少噪声干扰,实现平滑跟踪。

工具箱实现vision.KalmanFilter(配置状态方程和观测方程)。

适用场景:目标运动规律可预测(如车辆匀速行驶)、存在测量噪声的场景。

示例代码(跟踪运动目标)

% 1. 打开视频,手动框选初始目标
video = VideoReader('car_video.mp4');
frame = readFrame(video);
figure; imshow(frame); title('框选初始目标');
bbox = getrect;
center = [bbox(1)+bbox(3)/2, bbox(2)+bbox(4)/2];  % 目标中心坐标

% 2. 初始化卡尔曼滤波器(状态:位置(x,y)和速度(vx,vy))
stateSize = 4;  % [x, vx, y, vy]
measurementSize = 2;  % [x, y]
kalmanFilter = vision.KalmanFilter('StateSize', stateSize, ...
    'MeasurementSize', measurementSize, ...
    'TransitionModel', [1 1 0 0; 0 1 0 0; 0 0 1 1; 0 0 0 1], ...  匀速模型
    'MeasurementModel', [1 0 0 0; 0 0 1 0]);  % 观测模型

% 3. 初始化状态(位置+速度)
initialize(kalmanFilter, [center(1); 0; center(2); 0]);  % 初始速度为0

% 4. 逐帧跟踪(简化:假设目标中心可直接观测)
while hasFrame(video)
    frame = readFrame(video);
    % 预测目标位置
    predictedState = predict(kalmanFilter);
    predictedCenter = [predictedState(1), predictedState(3)];
    
    % (实际中需检测目标中心,此处简化为直接使用预测值附近区域)
    measuredCenter = predictedCenter;  % 实际应用中需替换为真实测量
    
    % 更新卡尔曼滤波器
    correctedState = correct(kalmanFilter, measuredCenter');
    
    % 计算边界框(假设尺寸不变)
    correctedCenter = [correctedState(1), correctedState(3)];
    trackedBbox = [correctedCenter(1)-bbox(3)/2, correctedCenter(2)-bbox(4)/2, bbox(3), bbox(4)];
    
    % 标注结果
    frame = insertObjectAnnotation(frame, 'rectangle', trackedBbox, 'Car');
    imshow(frame); drawnow;
end

优缺点

  • 优点:平滑跟踪轨迹,抗噪声能力强,适合运动规律明确的目标。
  • 缺点:依赖运动模型,目标运动突变(如急转)时跟踪误差大。
3. KCF跟踪(Kernelized Correlation Filters)

原理
基于核相关滤波,通过训练目标区域的相关滤波器,在后续帧中快速计算目标与滤波器的相关性,定位响应最大的区域(目标位置)。

工具箱实现vision.TrackerKCF(高性能实时跟踪器)。

适用场景:实时性要求高(如摄像头监控)、目标有一定纹理特征的场景(比均值漂移更鲁棒)。

示例代码

% 1. 打开摄像头(或视频)
video = videoinput('winvideo', 1);  % 摄像头
preview(video);

% 2. 读取第一帧,手动框选目标
frame = getsnapshot(video);
figure; imshow(frame); title('框选跟踪目标');
bbox = getrect;

% 3. 初始化KCF跟踪器
tracker = vision.TrackerKCF;
initialize(tracker, bbox, frame);

% 4. 实时跟踪
while true
    frame = getsnapshot(video);
    [bbox, isTracked] = step(tracker, frame);  % 快速更新目标位置
    
    % 标注结果
    if isTracked
        frame = insertObjectAnnotation(frame, 'rectangle', bbox, 'Target');
    else
        frame = insertText(frame, [10,10], '跟踪丢失', 'BoxColor', 'red');
    end
    imshow(frame); drawnow;
    
    % 按ESC退出
    if get(gcf, 'CurrentKey') == char(27)
        break;
    end
end
stop(video); delete(video);

优缺点

  • 优点:速度极快(实时性>30帧/秒),对尺度变化、部分遮挡有一定鲁棒性。
  • 缺点:目标完全遮挡或快速运动时易丢失;依赖目标纹理特征。

三、传统方法的整体特点与适用场景总结

方法类型 核心优势 局限性 最佳适用场景
传统检测 速度快、无需标注数据、轻量级 对复杂背景、目标形变/遮挡适应性差 刚性目标(人脸、零件)、简单背景质检
传统跟踪 实时性好、资源消耗低、无需预训练 依赖初始框、易受遮挡/背景干扰 固定摄像头监控、低速运动目标跟踪

更多推荐