基于肤色的人脸检测matlab代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

maincloseallclearallclc%输入图像名字img_name=input('请输入图像名字(图像必须为RGB图像,输入0结束):','s');%当输入0时结束while~strcmp(img_name,'0')%进行人脸识别facedetection(img_name);img_name=input('请输入图像名字(图像必须为RGB图像,输入0结束):','s');endfacedetectionfunctionfacedetection(img_name)%读取RGB图像I=imread(img_name);%转换为灰度图像gray=rgb2gray(I);%将图像转化为YCbCr颜色空间YCbCr=rgb2ycbcr(I);%获得图像宽度和高度heigth=size(gray,1);width=size(gray,2);%根据肤色模型将图像二值化fori=1:heigthforj=1:widthY=YCbCr(i,j,1);Cb=YCbCr(i,j,2);Cr=YCbCr(i,j,3);if(Y80)gray(i,j)=0;elseif(skin(Y,Cb,Cr)==1)gray(i,j)=255;elsegray(i,j)=0;endendendend%二值图像形态学处理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);holdon;fori=1:numbox=STATS(i).BoundingBox;x=box(1);%矩形坐标xy=box(2);%矩形坐标yw=box(3);%矩形宽度wh=box(4);%矩形高度h%宽度和高度的比例ratio=h/w;ux=uint8(x);uy=uint8(y);ifux1ux=ux-1;endifuy1uy=uy-1;end%可能是人脸区域的矩形应满足以下条件:%1、高度和宽度必须都大于20,且矩形面积大于400%2、高度和宽度比率应该在范围(0.6,2)内%3、函数findeye返回值为1ifw20||h20||w*h400continueelseifratio2&&ratio0.6&&findeye(gray,ux,uy,w,h)==1%记录可能为人脸的矩形区域result(n,:)=[uxuywh];n=n+1;endend%对可能是人脸的区域进行标记ifsize(result,1)==1&&result(1,1)0rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4)],'EdgeColor','r');else%如果满足条件的矩形区域大于1则再根据其他信息进行筛选form=1:size(result,1)m1=result(m,1);m2=result(m,2);m3=result(m,3);m4=result(m,4);%标记最终的人脸区域ifm1+m3width&&m2+m4heigthrectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endendendfindeye%判断二值图像中是否含有可能是眼睛的块%bImage----二值图像%x---------矩形左上角顶点X坐标%y---------矩形左上角顶点Y坐标%w---------矩形宽度%h---------矩形长度%如果有则返回值eye等于1,否则为0functioneye=findeye(bImage,x,y,w,h)%根据矩形相关属性得到二值图像中矩形区域中的数据%存放矩形区域二值图像信息part=zeros(h,w);%二值化fori=y:(y+h)forj=x:(x+w)ifbImage(i,j)==0part(i-y+1,j-x+1)=255;elsepart(i-y+1,j-x+1)=0;endendend[L,num]=bwlabel(part,8);%如果区域中有两个以上的矩形则认为有眼睛ifnum2eye=0;elseeye=1;endskin%AnilK.Jain提出的基于YCbCr颜色空间的肤色模型%根据当前点的CbCr值判断是否为肤色functionresult=skin(Y,Cb,Cr)%参数%a=25.39;a=28;%b=14.03;b=18;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(Y230)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;否则为肤色,返回1ifvalue1result=0;elseresult=1;end

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功