基于肤色的人脸检测matlab代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
main
close all
clear all
clc
%输入图像名字
img_name=input('请输入图像名字(图像必须为RGB图像,输入0结束):','s');
%当输入0时结束
while~strcmp(img_name,'0')
%进行人脸识别
facedetection(img_name);
img_name=input('请输入图像名字(图像必须为RGB图像,输入0结束):','s'); end
facedetection
function facedetection(img_name)
%读取RGB图像
I=imread(img_name);
%转换为灰度图像
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 rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r'); end end end findeye %判断二值图像中是否含有可能是眼睛的块 %bImage----二值图像 %x---------矩形左上角顶点X坐标 %y---------矩形左上角顶点Y坐标 %w---------矩形宽度 %h---------矩形长度 %如果有则返回值eye等于1,否则为0 function eye=findeye(bImage,x,y,w,h) %根据矩形相关属性得到二值图像中矩形区域中的数据 %存放矩形区域二值图像信息 part=zeros(h,w); %二值化 for i=y:(y+h) for j=x:(x+w) if bImage(i,j)==0 part(i-y+1,j-x+1)=255; else part(i-y+1,j-x+1)=0; end end end [L,num]=bwlabel(part,8); %如果区域中有两个以上的矩形则认为有眼睛 if num<2