Computer Vision Toolbox中目标检测与跟踪的传统方法
方法类型核心优势局限性最佳适用场景传统检测速度快、无需标注数据、轻量级对复杂背景、目标形变/遮挡适应性差刚性目标(人脸、零件)、简单背景质检传统跟踪实时性好、资源消耗低、无需预训练依赖初始框、易受遮挡/背景干扰固定摄像头监控、低速运动目标跟踪。
文章目录
在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帧/秒),对尺度变化、部分遮挡有一定鲁棒性。
- 缺点:目标完全遮挡或快速运动时易丢失;依赖目标纹理特征。
三、传统方法的整体特点与适用场景总结
| 方法类型 | 核心优势 | 局限性 | 最佳适用场景 |
|---|---|---|---|
| 传统检测 | 速度快、无需标注数据、轻量级 | 对复杂背景、目标形变/遮挡适应性差 | 刚性目标(人脸、零件)、简单背景质检 |
| 传统跟踪 | 实时性好、资源消耗低、无需预训练 | 依赖初始框、易受遮挡/背景干扰 | 固定摄像头监控、低速运动目标跟踪 |
更多推荐


所有评论(0)