人脸检测详细过程Word文件下载.docx
《人脸检测详细过程Word文件下载.docx》由会员分享,可在线阅读,更多相关《人脸检测详细过程Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
,:
1)));
im=zeros(size(I(:
face=zeros(size(I(:
cb=0.148*I(:
1)-0.291*I(:
2)+0.439*I(:
3)+128;
cr=0.439*I(:
1)-0.368*I(:
2)-0.071*I(:
[w,h]=size(I(:
1));
fori=1:
w
forj=1:
h
if140<
=cr(i,j)&
cr(i,j)<
=165&
140<
=cb(i,j)&
cb(i,j)<
=195&
0.01<
=hue(i,j)&
hue(i,j)<
=0.1
segment(i,j)=1;
else
segment(i,j)=0;
end
end
end
im(:
1)=I(:
1).*segment(:
2)=I(:
2).*segment(:
3)=I(:
3).*segment(:
skin_region=segment;
bw_face=rgb2gray(im);
bw_face=bwboundaries(bw_face);
bw_face_sz=size(bw_face);
fork=1:
bw_face_sz
(1)
bnd=bw_face{k};
rb2=double(max(bnd));
lt2=double(min(bnd));
if(max(rb2-lt2)>
20)
%rectangle('
Position'
[lt2
(2)左列,lt2
(1)上行,rb2
(2)-lt2
(2)宽,rb2
(1)-lt2
(1)高],'
EdgeColor'
'
g'
%画矩形
%rectangle('
[lt2
(2),lt2
(1),rb2
(2)-lt2
(2),rb2
(1)-lt2
(1)],'
j=lt2
(2):
rb2
(2);
M(lt2
(1),j,1)=0;
M(rb2
(1),j,1)=0;
i=lt2
(1):
rb2
(1);
M(i,lt2
(2),1)=0;
M(i,rb2
(2),1)=0;
M(lt2
(1),j,2)=200;
M(rb2
(1),j,2)=200;
M(i,lt2
(2),2)=200;
M(i,rb2
(2),2)=200;
M(lt2
(1),j,3)=140;
M(rb2
(1),j,3)=140;
M(i,lt2
(2),3)=140;
M(i,rb2
(2),3)=140;
aviobj=addframe(aviobj,uint8(M));
end%总循环结束
aviobj=close(aviobj);
mov=aviread('
movie(mov);
functionresult=skin(Y,Cb,Cr)
%参数
a=25.39;
b=14.03;
ecx=1.60;
ecy=2.41;
sita=2.53;
cx=109.38;
cy=152.02;
xishu=[cos(sita)sin(sita);
-sin(sita)cos(sita)];
%如果亮度大于230,则将长短轴同时扩大为原来的1.1倍
if(Y>
230)
a=1.1*a;
b=1.1*b;
%根据公式进行计算
Cb=double(Cb);
Cr=double(Cr);
t=[(Cb-cx);
(Cr-cy)];
temp=xishu*t;
value=(temp
(1)-ecx)^2/a^2+(temp
(2)-ecy)^2/b^2;
%大于1则不是肤色,返回0;
否则为肤色,返回1
ifvalue>
1
result=0;
result=1;
1functionfacedetection(img_name)
2%读取RGB图像
3I=imread(img_name);
4%转换为灰度图像
5gray=rgb2gray(I);
6%将图像转化为YCbCr颜色空间
7YCbCr=rgb2ycbcr(I);
8%获得图像宽度和高度
9heigth=size(gray,1);
10width=size(gray,2);
11%根据肤色模型将图像二值化
12fori=1:
heigth
13forj=1:
width
14Y=YCbCr(i,j,1);
15Cb=YCbCr(i,j,2);
16Cr=YCbCr(i,j,3);
17if(Y<
80)
18gray(i,j)=0;
19else
20if(skin(Y,Cb,Cr)==1)
21gray(i,j)=255;
22else
23gray(i,j)=0;
24end
25end
26end
27end
28%二值图像形态学处理
29SE=strel('
arbitrary'
eye(5));
30%gray=bwmorph(gray,'
erode'
31%imopen先腐蚀再膨胀
32gray=imopen(gray,SE);
33%imclose先膨胀再腐蚀
34%gray=imclose(gray,SE);
35imshow(gray);
36%取出图片中所有包含白色区域的最小矩形
37[L,num]=bwlabel(gray,8);
38STATS=regionprops(L,'
BoundingBox'
39%存放经过筛选以后得到的所有矩形块
40n=1;
41result=zeros(n,4);
42figure,imshow(I);
43holdon;
44fori=1:
num
45box=STATS(i).BoundingBox;
46x=box
(1);
%矩形坐标x
47y=box
(2);
%矩形坐标y
48w=box(3);
%矩形宽度w
49h=box(4);
%矩形高度h
50%宽度和高度的比例
51ratio=h/w;
52ux=uint8(x);
53uy=uint8(y);
54ifux>
55ux=ux-1;
56end
57ifuy>
58uy=uy-1;
59end
60%可能是人脸区域的矩形应满足以下条件:
61%1、高度和宽度必须都大于20,且矩形面积大于400
62%2、高度和宽度比率应该在范围(0.6,2)内
63%3、函数findeye返回值为1
64ifw<
20||h<
20||w*h<
400
65continue
66elseifratio<
2&
&
ratio>
0.6&
findeye(gray,ux,uy,w,h)==1
67%记录可能为人脸的矩形区域
68result(n,:
)=[uxuywh];
69n=n+1;
70end
71end
72%对可能是人脸的区域进行标记
73ifsize(result,1)==1&
result(1,1)>
0
74rectangle('
[result(1,1),result(1,2),result(1,3),result(1,4)],'
r'
75else
76%如果满足条件的矩形区域大于1则再根据其他信息进行筛选
77form=1:
size(result,1)
78m1=result(m,1);
79m2=result(m,2);
80m3=result(m,3);
81m4=result(m,4);
82%标记最终的人脸区域
83ifm1+m3<
width&
m2+m4<
heigth
84rectangle('
[m1,m2,m3,m4],'
85end
86end
87end
四、主函数(main.m)
88%清理窗口
89closeall
90clearall
91clc
92%输入图像名字
93img_name=input('
请输入图像名字(图像必须为RGB图像,输入0结束):
'
s'
94%当输入0时结束
95while~strcmp(img_name,'
0'
)
96%进行人脸识别
97facedetection(img_name);
98img_name=input('
99end
R187G131B68
二、眼睛粗略定位(findeye.m)
1%判断二值图像中是否含有可能是眼睛的块
2%bImage----二值图像
3%x---------矩形左上角顶点X坐标
4%y---------矩形左上角顶点Y坐标
5%w---------矩形宽度
6%h---------矩形长度
7%如果有则返回值eye等于1,否则为0
8functioneye=findeye(bImage,x,y,w,h)
9%根据矩