www.pudn.com > matlabfacedect.rar > facedetect.m


clear;  %清空工作区变量 
Image=imread('2lige.JPG');    %读取图像文件 
imshow(Image); 
Iycbcr=rgb2ycbcr(Image);        %颜色空间转换 
[m,n,k]=size(Image); 
for i=1:1:m                     %根据CbCr的阈值生成二值图像 
     for j=1:1:n 
          if(Iycbcr(i,j,2)<125&&Iycbcr(i,j,2)>90&&Iycbcr(i,j,3)<170&&Iycbcr(i,j,3)>133) 
            Ibw(i,j)=255; 
          else 
            Ibw(i,j)=0; 
          end 
     end 
end 
figure,imshow(Ibw); 
SE = strel('square',3); 
Ibwopen=imopen(Ibw,SE);         %开运算(即先腐蚀再膨胀),消除杂散点 
%figure,imshow(Ibwopen); 
Ibwoc=imclose(Ibwopen,SE);      %闭运算,去掉由于开运算引入的许多缺口 
%figure,imshow(Ibwoc); 
imf=imfill(Ibwoc,'holes');      %填充孔洞 
%figure,imshow(imf); 
Iedged=edge(imf,'Roberts');     %边缘检测 
%figure,imshow(Iedged); 
[Ilabeled regionnum]=bwlabel(Iedged,8);     %连通区域标记 
 
%regloc是一个二维数组,第1维:region编号,第2维:1234分别代表top、left、right、bottom值 
for i=1:1:regionnum 
    regloc(i,1)=n; 
    regloc(i,2)=m; 
    regloc(i,3)=0; 
    regloc(i,4)=0; 
end 
%通过对图像的象素级搜索得出各个连通区域的regloc值,为画框作准备 
for i=1:1:m 
    for j=1:1:n 
        if(Ilabeled(i,j)~=0) 
            num=Ilabeled(i,j); 
            if(iregloc(num,3)) 
                regloc(num,3)=j; 
            end 
            if(i>regloc(num,4)) 
                regloc(num,4)=i; 
            end 
        end 
    end 
end 
hold on; 
for num=1:1:regionnum 
    if(regloc(num,4)>(regloc(num,1)+(regloc(num,3)-regloc(num,2))*1.2))     %人脸长宽比限制 
       regloc(num,4)=regloc(num,1)+(regloc(num,3)-regloc(num,2))*1.2; 
    end 
    x=[regloc(num,2);regloc(num,2);regloc(num,3);regloc(num,3);regloc(num,2)]; 
    y=[regloc(num,1);regloc(num,4);regloc(num,4);regloc(num,1);regloc(num,1)]; 
    plot(x,y);      %画框 
end