Matlab实现人脸识别技术

1.人脸识别流程

1.1.1基本原理

基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。

1.1.2流程图

人脸识别流程图

  1. 人脸识别程序
  1. 人脸和非人脸区域分割程序

function result = skin(Y,Cb,Cr)

%SKIN Summary of this function goes here

%  Detailed explanation goes here

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;

end

%根据公式进行计算

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

if value>1

   result=0;

else

   result=1;

end

end

  1. 人脸的确认程序

function eye = findeye(bImage,x,y,w,h)

%FINDEYE Summary of this function goes here

%  Detailed explanation goes here

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

   eye=0;

else

   eye=1;

end

end

  1. 人脸识别主程序

clear all;

%读入原始图像

I=imread('face3.jpg');

gray=rgb2gray(I);

ycbcr=rgb2ycbcr(I);%将图像转化为YCbCr空间

heighth=size(gray,1);%读取图像尺寸

width=size(gray,2);

for i=1:heighth %利用肤色模型二值化图像

   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=imopen(gray,se);

figure;imshow(gray)

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=uint16(x);

   uy=uint8(y);

   if ux>1

       ux=ux-1;

   end

   if uy>1

       uy=uy-1;

   end

   if w<20 || h<20|| w*h<400 %矩形长宽的范围和矩形的面积可自行设定

       continue

   elseif ratio

       %根据“三庭五眼”规则高度和宽度比例应该在(0.6,2)内;

       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,则再根据其他信息进行筛选

   a=0;

   arr1=[];arr2=[];

   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<heighth && m3<0.2*width

           a=a+1;

           arr1(a)=m3;arr2(a)=m4;

          %rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');

       end

   end

   %得到人脸长度和宽度的最小区域

   arr3=[];arr3=sort(arr1,'ascend');

   arr4=[];arr4=sort(arr2,'ascend');

   %根据得到的数据标定最终的人脸区域

   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<heighth && m3<0.2*width

           m3=arr3(1);

           m4=arr4(1);

          rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');

       end

   end

end

(4)程序说明

人脸识别程序主要包含三个程序模块,人脸识别主程序由三部分构成。第一部分:将图像转化为YCbCr颜色空间,根据色彩模型进行图像二值化,二值化图像进行形态学处理、开运算,显示二值图像;第二部分:采用标记方法选取出图中的白色区域,度量区域属性,存放经过筛选以后得到的所有矩形块,筛选特定区域,存储人脸的矩形区域;第三部分:对于所有人脸的矩形区域,如果满足条件的矩形区域大于1则再根据其他信息进行筛选,标记最终的人脸区域。

图像分割程序中,利用肤色可以较为精确的将人脸和非人脸区域分割开来,得到较为精确的二值化图像。

人脸的确认程序,以存储的所有矩形区域作为研究对象,当区域内有眼睛存在时,才认为此区域为人脸区域

3运行结果

  1. 第一幅图

原始图像

肤色分割的二值化图像

人脸识别图像

  1. 第二幅图

原始图像

肤色分割的二值化图像

人脸识别图像

  1. 第三幅图

原始图像

肤色分割的二值化图像

人脸标定

如果课题设计中遇到困难疑惑之处,也可向私信小编咨询哟。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空