下面这个程序是haar-like特征提取-->haar-like关键点显示-->haar-like特征人脸检测代码,该段代码在运行时出现了如图片所示的bug,本人看不懂这个bug出错的根源:(各行代码已有注释,出错的那一行代码已经用黄色底纹标出,本段程序逻辑上的因果是连续的,不能只截取某一行或某几行代码作问题分析,所以提出的代码段有些长,敬请谅解)
function locs = Untitled3(imageFile)
% 判断参数
if nargin < 1
% 默认参数
imageFile = fullfile(pwd, 'C:\Users\Lenovo\Desktop\目标训练样本1.jpg');
end
% 读取图像
I = imread('C:\Users\Lenovo\Desktop\目标训练样本1.jpg');
% 灰度处理
if ndims(I) == 3
I = im2double(rgb2gray(I));
else
I = im2double(I);
end
% 命令构建
command='E:\33573 程序与数据\程序与数据(17日更新)\fig13-基于HaarLike的人脸检测\HaarLike.exe';
command = sprintf('%s %s', command, imageFile);
% 执行
eval(command);
% 获取结果数据
loc = load('E:\33573 程序与数据\程序与数据(17日更新)\fig13-基于HaarLike的人脸检测\tmp.key');
% 高斯平滑
g1 = fspecial('gaussian', 7, 1);
gray_image = imfilter(I, g1);
% 空间滤波
h = fspecial('sobel');
Ix = imfilter(gray_image,h,'replicate','same');
Iy = imfilter(gray_image,h','replicate','same');
% 参数配置
sigma = 2;
thd = 0.05;
r = 2;
% 高斯滤波
g = fspecial('gaussian',fix(6*sigma), sigma);
Ix2 = imfilter(Ix.^2, g, 'same').*(sigma^2);
Iy2 = imfilter(Iy.^2, g, 'same').*(sigma^2);
Ixy = imfilter(Ix.*Iy, g, 'same').*(sigma^2);
% 计算haar特征域
R = (Ix2.*Iy2 - Ixy.^2)./(Ix2 + Iy2 + eps);
d = 2*r+1;
% 提取特征点
localmax = ordfilt2(R,d^2,true(d));
R = R.*(and(R==localmax, R>thd));
% 去除四周噪声点
R([1:r, end-r:end], :) = 0;
R(:,[1:r,end-r:end]) = 0;
% 提取有效特征点
[xp,yp,~] = find(R);
% 存储并返回
locs{1} = loc;
locs{2} = [yp, xp];
% 显示关键点
function disp_haar_like_feature(image, locs)
% 显示窗口
figure('Position', [50 50 size(image,2) size(image,1)]);
% 色彩类型
colormap('gray');
% 显示
imagesc(image);
hold on;
% 角度变量
t = linspace(0, 2*pi);
for i = 1: size(locs{1},1)
% 生成位置x
xt = locs{1}(1) + locs{1}(3)*cos(t);
% 生成位置y
yt = locs{1}(2) + locs{1}(3)*sin(t);
% 显示
plot(xt, yt, 'r:', 'LineWidth', 2);
end
% 绘制特征点
plot(locs{2}(:,1), locs{2}(:,2), 'r*');
hold off;
clc; clear all; close all;
% 选择图像
imageFile = fullfile(pwd, 'C:\Users\Lenovo\Desktop\目标训练样本1.jpg');
image_origin = imread(imageFile);
% haar_like算子
loc = get_haar_like_feature(imageFile);
% 显示关键点
disp_haar_like_feature(image_origin, loc);