LBP 和 HOG 特征提取代码,以及完整的行人检测/人脸识别系统
一、LBP(局部二值模式)特征提取
1.1 基础 LBP 实现
matlab
%% lbp_feature.m - 局部二值模式特征提取
function lbp_hist = lbp_feature(img, varargin)
% 提取图像的LBP特征直方图
% img: 输入灰度图像
% varargin: 可选参数 [radius, neighbors]
% 返回: LBP直方图
if nargin < 2
radius = 1;
neighbors = 8;
else
radius = varargin{1};
neighbors = varargin{2};
end
% 确保图像是灰度图
if size(img, 3) > 1
img = rgb2gray(img);
end
img = double(img);
[rows, cols] = size(img);
% 初始化LBP图像
lbp_img = zeros(rows-2*radius, cols-2*radius);
% 计算采样点坐标
angles = 2*pi*(0:neighbors-1)/neighbors;
sample_x = round(radius * cos(angles));
sample_y = round(radius * sin(angles));
% 遍历每个像素(边界除外)
for i = radius+1:rows-radius
for j = radius+1:cols-radius
center = img(i, j);
lbp_code = 0;
% 比较周围像素与中心像素
for n = 1:neighbors
% 获取采样点坐标
x = i + sample_x(n);
y = j + sample_y(n);
% 确保坐标在图像范围内
if x >= 1 && x <= rows && y >= 1 && y <= cols
if img(x, y) >= center
lbp_code = lbp_code + 2^(n-1);
end
end
end
lbp_img(i-radius, j-radius) = lbp_code;
end
end
% 计算LBP直方图
bins = 2^neighbors; % LBP编码的可能取值数量
lbp_hist = zeros(bins, 1);
for i = 1:bins
lbp_hist(i) = sum(lbp_img(:) == i-1);
end
% 归一化
lbp_hist = lbp_hist / sum(lbp_hist);
end
1.2 旋转不变 LBP
matlab
%% lbp_rotation_invariant.m - 旋转不变LBP
function ri_lbp_hist = lbp_rotation_invariant(img, radius, neighbors)
% 旋转不变LBP特征
% 通过取LBP编码的最小旋转等价类
lbp_hist = lbp_feature(img, radius, neighbors);
bins = 2^neighbors;
% 计算旋转不变编码
ri_codes = zeros(bins, 1);
for code = 0:bins-1
min_code = code;
temp = code;
% 循环移位找到最小值
for shift = 1:neighbors
temp = bitshift(temp, 1, neighbors) + bitget(temp, neighbors);
if temp < min_code
min_code = temp;
end
end
ri_codes(code+1) = min_code;
end
% 合并相同旋转不变编码的直方图
unique_codes = unique(ri_codes);
ri_lbp_hist = zeros(length(unique_codes), 1);
for i = 1:length(unique_codes)
code = unique_codes(i);
ri_lbp_hist(i) = sum(lbp_hist(ri_codes == code));
end
% 归一化
ri_lbp_hist = ri_lbp_hist / sum(ri_lbp_hist);
end
1.3 多尺度 LBP
matlab
%% multiscale_lbp.m - 多尺度LBP特征
function ms_lbp_hist = multiscale_lbp(img, scales)
% 多尺度LBP特征提取
% scales: 不同半径的LBP特征
if nargin < 2
scales = [1, 2, 3]; % 默认三个尺度
end
ms_lbp_hist = [];
for s = 1:length(scales)
radius = scales(s);
neighbors = 8; % 固定8个邻居
% 提取当前尺度的LBP特征
lbp_hist = lbp_feature(img, radius, neighbors);
% 拼接特征
ms_lbp_hist = [ms_lbp_hist; lbp_hist];
end
% 归一化
ms_lbp_hist = ms_lbp_hist / sum(ms_lbp_hist);
end
二、HOG(方向梯度直方图)特征提取
2.1 基础 HOG 实现
matlab
%% hog_feature.m - 方向梯度直方图特征提取
function hog_features = hog_feature(img, varargin)
% 提取HOG特征
% img: 输入图像
% varargin: [cell_size, block_size, nbins]
% 返回: HOG特征向量
if nargin < 2
cell_size = [8, 8]; % 单元格大小
block_size = [2, 2]; % 块大小(单元格数)
nbins = 9; % 方向bin数
else
cell_size = varargin{1};
block_size = varargin{2};
nbins = varargin{3};
end
% 确保图像是灰度图
if size(img, 3) > 1
img = rgb2gray(img);
end
img = double(img);
[rows, cols] = size(img);
% 1. 计算梯度
[gx, gy] = gradient(img);
mag = sqrt(gx.^2 + gy.^2);
ang = atan2(gy, gx) * 180 / pi; % 角度转为0-360度
ang(ang < 0) = ang(ang < 0) + 360; % 确保所有角度为正
% 2. 为每个单元格计算方向直方图
cell_rows = floor(rows / cell_size(1));
cell_cols = floor(cols / cell_size(2));
% 初始化单元格直方图
cell_hists = zeros(cell_rows, cell_cols, nbins);
for i = 1:cell_rows
for j = 1:cell_cols
% 获取当前单元格的梯度
row_start = (i-1)*cell_size(1) + 1;
row_end = min(i*cell_size(1), rows);
col_start = (j-1)*cell_size(2) + 1;
col_end = min(j*cell_size(2), cols);
cell_mag = mag(row_start:row_end, col_start:col_end);
cell_ang = ang(row_start:row_end, col_start:col_end);
% 计算方向直方图
hist = zeros(nbins, 1);
bin_width = 360 / nbins;
for m = 1:size(cell_mag, 1)
for n = 1:size(cell_mag, 2)
if cell_mag(m, n) > 0
% 确定方向bin
bin_idx = floor(cell_ang(m, n) / bin_width) + 1;
if bin_idx > nbins
bin_idx = 1;
end
% 加权投票
hist(bin_idx) = hist(bin_idx) + cell_mag(m, n);
end
end
end
cell_hists(i, j, :) = hist;
end
end
% 3. 块归一化
block_rows = cell_rows - block_size(1) + 1;
block_cols = cell_cols - block_size(2) + 1;
hog_features = [];
for i = 1:block_rows
for j = 1:block_cols
% 获取当前块的所有单元格直方图
block_hists = cell_hists(i:i+block_size(1)-1, j:j+block_size(2)-1, :);
block_hists = reshape(block_hists, [], nbins);
% L2归一化
norm_factor = sqrt(sum(block_hists.^2) + 1e-6);
block_hists = block_hists / norm_factor;
% 添加到特征向量
hog_features = [hog_features; block_hists(:)];
end
end
% 最终归一化
hog_features = hog_features / sqrt(sum(hog_features.^2) + 1e-6);
end
2.2 带重叠的 HOG
matlab
%% hog_overlap.m - 带重叠的HOG特征
function hog_features = hog_overlap(img, cell_size, block_size, overlap, nbins)
% 带重叠的HOG特征提取
% overlap: 块之间的重叠比例 [0,1]
if nargin < 5
overlap = 0.5; % 默认50%重叠
end
% 确保图像是灰度图
if size(img, 3) > 1
img = rgb2gray(img);
end
img = double(img);
[rows, cols] = size(img);
% 计算梯度
[gx, gy] = gradient(img);
mag = sqrt(gx.^2 + gy.^2);
ang = atan2(gy, gx) * 180 / pi;
ang(ang < 0) = ang(ang < 0) + 360;
% 单元格大小
cell_rows = floor(rows / cell_size(1));
cell_cols = floor(cols / cell_size(2));
% 块步长(考虑重叠)
block_stride = round(block_size * (1 - overlap));
% 初始化特征向量
hog_features = [];
% 滑动块
for i = 1:block_stride(1):cell_rows-block_size(1)+1
for j = 1:block_stride(2):cell_cols-block_size(2)+1
% 获取当前块
block_hists = zeros(block_size(1), block_size(2), nbins);
for ci = 1:block_size(1)
for cj = 1:block_size(2)
% 单元格坐标
cell_i = i + ci - 1;
cell_j = j + cj - 1;
% 获取单元格内的像素
row_start = (cell_i-1)*cell_size(1) + 1;
row_end = min(cell_i*cell_size(1), rows);
col_start = (cell_j-1)*cell_size(2) + 1;
col_end = min(cell_j*cell_size(2), cols);
cell_mag = mag(row_start:row_end, col_start:col_end);
cell_ang = ang(row_start:row_end, col_start:col_end);
% 计算方向直方图
hist = zeros(nbins, 1);
bin_width = 360 / nbins;
for m = 1:size(cell_mag, 1)
for n = 1:size(cell_mag, 2)
if cell_mag(m, n) > 0
bin_idx = floor(cell_ang(m, n) / bin_width) + 1;
if bin_idx > nbins
bin_idx = 1;
end
hist(bin_idx) = hist(bin_idx) + cell_mag(m, n);
end
end
end
block_hists(ci, cj, :) = hist;
end
end
% 块归一化
block_hists = reshape(block_hists, [], nbins);
norm_factor = sqrt(sum(block_hists.^2) + 1e-6);
block_hists = block_hists / norm_factor;
% 添加到特征向量
hog_features = [hog_features; block_hists(:)];
end
end
% 最终归一化
hog_features = hog_features / sqrt(sum(hog_features.^2) + 1e-6);
end
三、LBP + HOG 融合特征
3.1 特征融合
matlab
%% fusion_features.m - LBP和HOG特征融合
function fused_features = fusion_features(img, lbp_params, hog_params)
% 融合LBP和HOG特征
% lbp_params: [radius, neighbors, scales]
% hog_params: [cell_size, block_size, nbins, overlap]
% 提取LBP特征
if length(lbp_params) >= 3
lbp_feat = multiscale_lbp(img, lbp_params{3});
else
lbp_feat = lbp_feature(img, lbp_params{1}, lbp_params{2});
end
% 提取HOG特征
if length(hog_params) >= 4
hog_feat = hog_overlap(img, hog_params{1}, hog_params{2}, hog_params{4}, hog_params{3});
else
hog_feat = hog_feature(img, hog_params{1}, hog_params{2}, hog_params{3});
end
% 特征融合(串联)
fused_features = [lbp_feat; hog_feat];
% 归一化
fused_features = fused_features / sqrt(sum(fused_features.^2) + 1e-6);
end
3.2 特征降维(PCA)
matlab
%% pca_reduction.m - PCA特征降维
function reduced_features = pca_reduction(features, num_components)
% PCA降维
% features: 特征矩阵 [样本数 × 特征维数]
% num_components: 保留的主成分数
% 中心化
mean_feature = mean(features);
centered_features = features - mean_feature;
% 计算协方差矩阵
cov_matrix = (centered_features' * centered_features) / (size(features, 1) - 1);
% 特征值分解
[eigenvectors, eigenvalues] = eig(cov_matrix);
eigenvalues = diag(eigenvalues);
% 按特征值降序排序
[sorted_eigenvalues, idx] = sort(eigenvalues, 'descend');
sorted_eigenvectors = eigenvectors(:, idx);
% 选择前num_components个主成分
selected_eigenvectors = sorted_eigenvectors(:, 1:num_components);
% 投影到低维空间
reduced_features = centered_features * selected_eigenvectors;
% 保存均值和投影矩阵(用于测试时)
save('pca_model.mat', 'mean_feature', 'selected_eigenvectors', 'num_components');
end
四、完整识别系统
4.1 训练脚本 (train_recognition_system.m)
matlab
%% train_recognition_system.m - 训练LBP+HOG识别系统
clear; clc; close all;
fprintf('=== LBP+HOG 特征识别系统训练 ===\n\n');
%% 1. 参数设置
lbp_params = {1, 8, [1, 2, 3]}; % 半径1,8个邻居,3个尺度
hog_params = {[8, 8], [2, 2], 9, 0.5}; % 8x8单元格,2x2块,9个方向,50%重叠
% 训练参数
train_ratio = 0.8; % 训练集比例
num_classes = 2; % 类别数(例如:行人/非行人)
samples_per_class = 100; % 每类样本数
fprintf('LBP参数: 半径=%d, 邻居=%d, 尺度=%d\n', lbp_params{1}, lbp_params{2}, length(lbp_params{3}));
fprintf('HOG参数: 单元格=%dx%d, 块=%dx%d, 方向=%d\n', ...
hog_params{1}(1), hog_params{1}(2), hog_params{2}(1), hog_params{2}(2), hog_params{3});
%% 2. 生成/加载训练数据
fprintf('\n加载训练数据...\n');
% 这里使用合成数据演示,实际使用时应替换为真实图像
train_features = [];
train_labels = [];
for class_id = 1:num_classes
fprintf(' 处理类别 %d...\n', class_id);
for sample_id = 1:samples_per_class
% 生成合成图像(实际使用时替换为真实图像)
img = generate_synthetic_image(class_id, sample_id);
% 提取融合特征
features = fusion_features(img, lbp_params, hog_params);
% 添加到训练集
train_features = [train_features; features'];
train_labels = [train_labels; class_id];
end
end
fprintf('训练集大小: %d 个样本, %d 维特征\n', size(train_features, 1), size(train_features, 2));
%% 3. 特征降维
fprintf('\n特征降维...\n');
num_components = min(100, size(train_features, 2)); % 保留100个主成分
reduced_features = pca_reduction(train_features, num_components);
fprintf('降维后特征维度: %d\n', num_components);
%% 4. 训练SVM分类器(手写实现)
fprintf('\n训练SVM分类器...\n');
svm_model = train_svm(reduced_features, train_labels);
fprintf('SVM训练完成\n');
%% 5. 保存模型
save('recognition_model.mat', 'svm_model', 'lbp_params', 'hog_params', 'num_components');
fprintf('模型已保存到 recognition_model.mat\n\n');
%% 6. 测试系统
fprintf('=== 系统测试 ===\n');
test_recognition_system();
4.2 SVM 分类器(手写实现)
matlab
%% train_svm.m - 手写SVM训练(SMO简化版)
function svm_model = train_svm(features, labels)
% 简化版SVM训练(线性核)
% 使用梯度下降优化
[num_samples, num_features] = size(features);
% 转换为二分类标签 {-1, +1}
binary_labels = labels;
binary_labels(labels == 1) = -1;
binary_labels(labels == 2) = +1;
% 初始化权重
w = zeros(num_features, 1);
b = 0;
% 训练参数
learning_rate = 0.01;
lambda = 0.01; % 正则化参数
num_epochs = 1000;
% 梯度下降训练
for epoch = 1:num_epochs
% 计算梯度
gradients = zeros(num_features, 1);
bias_gradient = 0;
for i = 1:num_samples
% 预测
prediction = binary_labels(i) * (features(i, :) * w + b);
if prediction < 1
% 误分类,更新梯度
gradients = gradients - binary_labels(i) * features(i, :)';
bias_gradient = bias_gradient - binary_labels(i);
end
end
% 添加正则化梯度
gradients = gradients + lambda * w;
% 更新参数
w = w - learning_rate * gradients;
b = b - learning_rate * bias_gradient;
% 打印进度
if mod(epoch, 100) == 0
% 计算训练准确率
predictions = features * w + b;
predicted_labels = ones(num_samples, 1);
predicted_labels(predictions < 0) = 1; % 注意:我们的标签是1和2
predicted_labels(predictions >= 0) = 2;
accuracy = sum(predicted_labels == labels) / num_samples;
fprintf(' Epoch %d: 准确率=%.2f%%\n', epoch, accuracy*100);
end
end
% 保存模型
svm_model.w = w;
svm_model.b = b;
svm_model.accuracy = accuracy;
end
4.3 测试系统 (test_recognition_system.m)
matlab
%% test_recognition_system.m - 测试识别系统
function test_recognition_system()
% 加载模型
load('recognition_model.mat');
% 生成测试图像
num_test = 20;
test_features = [];
test_labels = [];
fprintf('生成测试数据...\n');
for class_id = 1:2
for i = 1:num_test/2
img = generate_synthetic_image(class_id, i + 1000); % 不同的种子
features = fusion_features(img, lbp_params, hog_params);
test_features = [test_features; features'];
test_labels = [test_labels; class_id];
end
end
% 降维(使用训练时的PCA模型)
load('pca_model.mat'); % 加载PCA模型
centered_features = test_features - mean_feature;
reduced_features = centered_features * selected_eigenvectors;
% 预测
predictions = reduced_features * svm_model.w + svm_model.b;
predicted_labels = ones(size(predictions));
predicted_labels(predictions < 0) = 1;
predicted_labels(predictions >= 0) = 2;
% 计算准确率
accuracy = sum(predicted_labels == test_labels) / length(test_labels);
fprintf('测试准确率: %.2f%%\n', accuracy*100);
% 混淆矩阵
confusion = zeros(2, 2);
for i = 1:length(test_labels)
actual = test_labels(i);
predicted = predicted_labels(i);
confusion(actual, predicted) = confusion(actual, predicted) + 1;
end
fprintf('\n混淆矩阵:\n');
fprintf(' 预测1 预测2\n');
fprintf('实际1 %3d %3d\n', confusion(1,1), confusion(1,2));
fprintf('实际2 %3d %3d\n', confusion(2,1), confusion(2,2));
% 可视化一些测试结果
visualize_test_results(test_features, predicted_labels, test_labels);
end
4.4 合成图像生成(用于演示)
matlab
%% generate_synthetic_image.m - 生成合成图像
function img = generate_synthetic_image(class_id, seed)
% 生成合成图像用于演示
% class_id: 1=行人,2=非行人
rng(seed); % 设置随机种子
% 基础图像
img = zeros(128, 64, 3); % 行人检测常用尺寸
if class_id == 1 % 行人
% 人体轮廓
img = img + 0.3; % 灰色背景
% 头部(圆形)
[X, Y] = meshgrid(1:64, 1:128);
head_center = [32, 20];
head_radius = 10;
head_mask = (X - head_center(1)).^2 + (Y - head_center(2)).^2 <= head_radius^2;
img(head_mask, :) = 0.8;
% 身体(矩形)
body_rect = [20, 30, 45, 100]; % [x1, y1, x2, y2]
img(body_rect(2):body_rect(4), body_rect(1):body_rect(3), :) = 0.6;
% 四肢
limb_width = 5;
% 左臂
img(40:70, 25:30, :) = 0.5;
% 右臂
img(40:70, 55:60, :) = 0.5;
% 左腿
img(75:120, 25:30, :) = 0.4;
% 右腿
img(75:120, 45:50, :) = 0.4;
else % 非行人(背景)
% 随机纹理
img(:,:,1) = rand(128, 64) * 0.5;
img(:,:,2) = rand(128, 64) * 0.5;
img(:,:,3) = rand(128, 64) * 0.5;
% 添加一些几何形状
img(20:40, 10:30, :) = 0.8;
img(80:100, 40:60, :) = 0.7;
img(50:70, 80:100, :) = 0.9;
end
% 添加噪声
noise = randn(128, 64, 3) * 0.05;
img = img + noise;
% 确保像素值在[0,1]范围内
img = max(0, min(1, img));
end
4.5 结果可视化
matlab
%% visualize_test_results.m - 可视化测试结果
function visualize_test_results(features, predicted_labels, actual_labels)
figure('Name', 'LBP+HOG 识别系统测试结果', 'NumberTitle', 'off', 'Position', [100, 100, 1200, 500]);
% 1. 特征分布
subplot(2,3,1);
gscatter(features(:,1), features(:,2), predicted_labels, 'rb', 'o*');
xlabel('特征1'); ylabel('特征2');
title('特征空间分布');
grid on;
% 2. 预测结果
subplot(2,3,2);
bar([sum(predicted_labels==1), sum(predicted_labels==2)]);
set(gca, 'XTickLabel', {'类别1', '类别2'});
ylabel('样本数');
title('预测类别分布');
% 3. 实际标签分布
subplot(2,3,3);
bar([sum(actual_labels==1), sum(actual_labels==2)]);
set(gca, 'XTickLabel', {'类别1', '类别2'});
ylabel('样本数');
title('实际类别分布');
% 4. 准确率随特征维度变化
subplot(2,3,4);
dimensions = [10, 20, 50, 100, 200];
accuracies = [0.75, 0.82, 0.88, 0.92, 0.94]; % 示例数据
plot(dimensions, accuracies, 'bo-', 'LineWidth', 2);
xlabel('特征维度'); ylabel('准确率');
title('准确率 vs 特征维度');
grid on;
% 5. 混淆矩阵热力图
subplot(2,3,5);
confusion = zeros(2,2);
for i = 1:length(actual_labels)
confusion(actual_labels(i), predicted_labels(i)) = confusion(actual_labels(i), predicted_labels(i)) + 1;
end
imagesc(confusion);
colormap('hot');
colorbar;
set(gca, 'XTick', 1:2, 'XTickLabel', {'类别1', '类别2'}, ...
'YTick', 1:2, 'YTickLabel', {'类别1', '类别2'});
title('混淆矩阵');
xlabel('预测标签'); ylabel('实际标签');
% 6. ROC曲线(简化版)
subplot(2,3,6);
fpr = [0, 0.1, 0.2, 0.3, 0.4, 0.5];
tpr = [0, 0.6, 0.8, 0.9, 0.95, 1.0]; % 示例数据
plot(fpr, tpr, 'r-', 'LineWidth', 2);
hold on;
plot([0,1], [0,1], 'k--');
xlabel('假正率'); ylabel('真正率');
title('ROC曲线');
grid on;
sgtitle('LBP+HOG 特征识别系统性能评估');
end
五、实际应用示例
5.1 行人检测
matlab
%% pedestrian_detection.m - 行人检测示例
clear; clc; close all;
% 加载训练好的模型
load('recognition_model.mat');
% 读取测试图像
img = imread('pedestrian.jpg'); % 替换为您的图像
% 预处理
img = imresize(img, [128, 64]); % 调整为标准尺寸
% 提取特征
features = fusion_features(img, lbp_params, hog_params);
% 降维
load('pca_model.mat');
centered_features = features - mean_feature;
reduced_features = centered_features * selected_eigenvectors;
% 预测
score = reduced_features * svm_model.w + svm_model.b;
prediction = 2; % 默认行人
if score < 0
prediction = 1; % 非行人
end
% 显示结果
figure;
imshow(img);
if prediction == 2
title('检测结果: 行人', 'Color', 'g', 'FontSize', 14);
rectangle('Position', [1, 1, 63, 127], 'EdgeColor', 'g', 'LineWidth', 3);
else
title('检测结果: 非行人', 'Color', 'r', 'FontSize', 14);
end
fprintf('检测得分: %.4f\n', score);
fprintf('预测类别: %s\n', prediction == 2 ? '行人' : '非行人');
5.2 人脸识别
matlab
%% face_recognition.m - 人脸识别示例
clear; clc; close all;
% 参数调整(人脸识别需要更精细的参数)
lbp_params = {1, 8, [1, 2]}; % 人脸识别通常用较少尺度
hog_params = {[16, 16], [2, 2], 9, 0.5}; % 更大的单元格
% 加载人脸数据库
face_database = load_face_database(); % 需要实现
% 训练识别器
train_recognition_system();
% 测试新人脸
img = imread('unknown_face.jpg');
img = imresize(img, [128, 128]);
% 提取特征并识别
features = fusion_features(img, lbp_params, hog_params);
load('recognition_model.mat');
centered_features = features - mean_feature;
reduced_features = centered_features * selected_eigenvectors;
% 与数据库中的所有人脸比较
min_distance = inf;
identified_person = -1;
for i = 1:length(face_database.features)
distance = norm(reduced_features - face_database.features(i, :));
if distance < min_distance
min_distance = distance;
identified_person = i;
end
end
% 显示结果
if min_distance < threshold % 需要设置合适的阈值
fprintf('识别结果: %s (距离: %.4f)\n', face_database.names{identified_person}, min_distance);
else
fprintf('未识别此人 (最小距离: %.4f)\n', min_distance);
end
参考代码 检测lbp+hog特征 www.youwenfan.com/contentcsv/113018.html
六、性能优化建议
6.1 速度优化
matlab
% 1. 使用积分图像加速LBP
function integral_img = compute_integral_image(img)
integral_img = cumsum(cumsum(double(img), 1), 2);
end
% 2. 并行计算特征提取
parfor i = 1:num_images
features(i, :) = fusion_features(images{i}, lbp_params, hog_params);
end
% 3. 使用Mex文件加速关键部分
% 将LBP和HOG的核心循环用C语言实现,编译为Mex文件
6.2 精度优化
matlab
% 1. 多尺度检测
scales = [0.5, 0.75, 1.0, 1.25, 1.5];
for s = 1:length(scales)
scaled_img = imresize(img, scales(s));
% 在缩放后的图像上检测
end
% 2. 滑动窗口检测
window_size = [128, 64];
stride = 8;
for y = 1:stride:img_height-window_size(1)
for x = 1:stride:img_width-window_size(2)
window = img(y:y+window_size(1)-1, x:x+window_size(2)-1, :);
% 检测窗口
end
end
% 3. 非极大值抑制
detections = non_max_suppression(all_detections, 0.5);
七、总结
这个完整的 LBP+HOG 特征识别系统具有以下特点:
- 完全手写实现:不依赖任何计算机视觉工具箱
- 模块化设计:LBP、HOG、特征融合、分类器各自独立
- 可扩展性:可以轻松添加新的特征或分类器
- 实用性:包含训练、测试、可视化的完整流程
- 灵活性:适用于行人检测、人脸识别等多种应用
您可以根据具体应用需求调整参数,例如:
- 对于行人检测:使用较大的HOG单元格(8×8或16×16)
- 对于人脸识别:使用较小的LBP半径和更多尺度
- 对于实时应用:减少特征维度,使用更简单的分类器