www.gusucode.com > 关于海航matlab和lingo的训练题 > facedetection.m

    %三、人脸检测(facedetection.m)

function facedetection(z1)
%% 读取RGB图像
I=imread(z1);
%% 转换为灰度图像
gray=rgb2gray(I);
%% 将图像转化为YCbCr色彩空间
YCbCr=rgb2ycbcr(I);
%% 获得图像宽度和高度
heigth=size(gray,1);
width=size(gray,2);
%% 按照肤色模型将图像二值化
for i=1:heigth
for j=1:width
Y=YCbCr(i,j,1);
Cb=YCbCr(i,j,2);
Cr=YCbCr(i,j,3);
if(Y<80)
gray(i,j)=0;
else
if(skin(Y,Cb,Cr) == 1)
gray(i,j)=255;
else
gray(i,j)=0;
end
end
end
end
%% 二值图像形态学处理惩罚
SE=strel('arbitrary',eye(5)); 
%%gray = bwmorph(gray,'erode');
%% imopen先腐化再膨胀
gray=imopen(gray,SE);
%% imclose先膨胀再腐化
%%gray=imclose(gray,SE);
imshow(gray);
%% 取出图片中所有包含白色区域的最小矩形
[L,num]=bwlabel(gray,8);
STATS=regionprops(L,'BoundingBox');
%% 存放经过筛选今后获得的所有矩形块
n=1;
result=zeros(n,4);
figure,imshow(I);
hold on;
for i = 1:num
box=STATS(i).BoundingBox;
x=box(1);% %矩形坐标x
y=box(2); %%矩形坐标y
w=box(3); %%矩形宽度w
h=box(4);% %矩形高度h
%% 宽度和高度的比例
ratio=h/w;
ux=uint8(x);
uy=uint8(y);
if ux>1
ux=ux-1;
end
if uy>1
uy=uy-1;
end
%% 可能是人脸区域的矩形应满足以下前提:
%% 1、高度和宽度必须都大于20,且矩形面积大于400
%% 2、高度和宽度比率应当在局限(0.6,2)内
%% 3、函数findeye返回值为1
if w<20 ||h<20|| w*h<400
continue
elseif ratio<2&&ratio>0.6 && findeye(gray,ux,uy,w,h)==1
%% 记录可能为人脸的矩形区域
result(n,:)=[ux uy w h];
n=n+1;
end
end
%% 对可能是人脸的区域进行标识表记标帜
if size(result,1)==1&&result(1,1) > 0
rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4)],'EdgeColor','r');
else
%% 若是满足前提的矩形区域大于1则再按照其他信息进行筛选
for m=1:size(result,1)
m1=result(m,1);
m2=result(m,2);
m3=result(m,3);
m4=result(m,4);
%% 标识表记标帜终极的人脸区域
if m1+m3<width&&m2+m4<heigth
rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');
end
end
end

%四、主函数(main.m)

%%清理窗口
close all
clear all
clc
%% 输入图像名字
z1=input('请输入图像名字(图像必须为RGB图像,输入0停止):','s');
%% 当输入0时停止
while ~strcmp(z1,'0')
%% 进行人脸辨认
facedetection(z1);
z1=input('请输入图像名字(图像必须为RGB图像,输入0停止):','s');
end