⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 color_muban.m

📁 人脸检测的方法很多
💻 M
字号:

%平均模板代码   32lie*34hang
I1=imread('I1.bmp')
I2=imread('I2.bmp')
I3=imread('I3.bmp')
I4=imread('I4.bmp')
I5=imread('I5.bmp')
I6=imread('I6.bmp')
I7=imread('I7.bmp')
I8=imread('I8.bmp')
I9=imread('I9.bmp')
I10=imread('I10.bmp')
Igray1=rgb2gray(I1)
Igray2=rgb2gray(I2)
Igray3=rgb2gray(I3)
Igray4=rgb2gray(I4)
Igray5=rgb2gray(I5)
Igray6=rgb2gray(I6)
Igray7=rgb2gray(I7)
Igray8=rgb2gray(I8)
Igray9=rgb2gray(I9)
Igray10=rgb2gray(I10)
Imean12=Igray1/2+Igray2/2
Imean34=Igray3/2+Igray4/2
Imean56=Igray5/2+Igray6/2
Imean78=Igray7/2+Igray8/2
Imean910=Igray9/2+Igray10/2
Imean16=Imean12/3+Imean34/3+Imean56/3
Imean710=Imean78/2+Imean910/2
Imean=Imean16/2+Imean710/2
imshow(Imean)
%标准模板形成
%求模板的均值与方差
uI=mean2(Imean)
DImean=0.0
for i=1:32
for j=1:32
Idouble=double(Imean(i,j))
DImean=DImean+(Idouble-uI)^2
end
end
DIbiao=(DImean/768)^(1/2)
%模板灰度标准化
rateI=80/DIbiao
for i=1:32
for j=1:32
Imean(i,j)=rateI*(Imean(i,j)-uI)+128
end
end


%%待检测人脸
I=imread('face_detection.jpg')
gray=rgb2gray(I)
gray1=gray
%imshow(gray1)
hsv=rgb2hsv(I)
H=hsv(:,:,1)
Hselect=H<0.08&H>0.02
imshow(Hselect)
bwAreaOpenBW = bwareaopen(Hselect,150);
%imshow(bwAreaOpenBW)
BWfill = imfill(bwAreaOpenBW,'holes')
%imshow(BWfill)
[L,num]= bwlabel(BWfill,8)
%STATS = regionprops(L,'basic')
for i=1:num     %%%选择一个被标记的后选人脸
    select_1=L==i
     [i,j]=find(select_1==1); 
     imin=min(i);     
     imax=max(i);     
     jmin=min(j);     
     jmax=max(j);  
    % h=imax-imin
    % w=jmax-jmin
    % if h>1.6*w
     %    h1=round(1.6*w)
     bw1=select_1(imin:imax,jmin:jmax); %%%框出
     chang_bian=max(imax-imin,jmax-jmin)
     duan_bian=min(imax-imin,jmax-jmin)
     [Il Ic]=size(gray1)
     if jmin+chang_bian>Ic    %%%%正方形宽超界..。。一般是宽超界
        wide_d=jmin+chang_bian-Ic%%%左移
         if jmin-wide_d<1
             gray_bw1=gray1(imin:imin+Ic-1,1:Ic)
             chang_bian=Ic
         else
            gray_bw1=gray1(imin:imax,jmin-wide_d:Ic)
         end
     elseif imin+chang_bian>Il   %%%%正方形宽超界..。。一般是宽超界
         high_d=imin+chang_bian-Il%%%上移
         if imin-high_d<1
             gray_bw1=gray1(1:Il,jmin:jmin+Il-1)
             chang_bian=Il
         else
            gray_bw1=gray1(imin-high_d:Il,jmin:jmax)
         end
     else gray_bw1=gray1(imin:imin+chang_bian,jmin:jmin+chang_bian) %不超界时的情况
        % gray_bw1=gray1(imin:imax,jmin:jmax)
     end
   % i1=round((16-ip)/2);    
   % j1=round((16-jp)/2);     
   % p1(i1+1:i1+i,j1+1:j1+j)=Imatch     
   % p1=-1.*p1+ones(16,16);     
   % for m=0:15        
   %     p(m*16+1:(m+1)*16,kk+1)=p1(1:16,m+1);  
   % end 

%     if (jmax-jmin)/(imax-imin)<1.5  %%%%高宽比小于1.5不处理
%       continue
%     else
%         
%     end
     %%%% 处理旋转的问题
%rot_ang  注意角度与弧度的转变

[i,j]=find(bw1==1); 
x=mean2(i)
y=mean2(j)
x_u=i-x
y_u=j-y
a=x_u.'*x_u
b=2*(x_u.'*y_u)
c=y_u.'*y_u
rot_ang=1/2*atan(b/(a-c))
rot=imrotate(bw1,-rot_ang/pi*180)
gray_rot=imrotate(gray_bw1,-rot_ang/pi*180)
figure,imshow(rot)
end
[l,c]=find(rot==1); 
     imin=min(l);     
     imax=max(l);     
     jmin=min(c);     
     jmax=max(c);     
     g_k_b=(imax-imin)/(jmax-jmin)
     if g_k_b>0.8&g_k_b<2.6
        % if g_k_b>1.6
             
figure,imshow(gray_rot)
     rot_ang_abs=abs(rot_ang)%旋转了多大的角
     rot_bian=chang_bian*(sin(rot_ang_abs)+cos(rot_ang_abs))
     rot_bian=round(rot_bian)
%rot_bian到nei_bian的距离为d
d=chang_bian*sin(rot_ang_abs)/(1+tan(rot_ang_abs))
d=round(d)
if d==0
    d=1  %矩阵从1开始
end
xuanzhedaipipeide=gray_rot(d:rot_bian-d,d:rot_bian-d)
figure,imshow(xuanzhedaipipeide)
else continue
     end
end
%end
Imatch=imresize(xuanzhedaipipeide,[32 32])



%rate=32/max(size(bw1));    
 %    Imatch=imresize(bw1,rate);       [ip,jp]=size(bw1);      if ip>32        ip=32     end

    %%求待检测人脸的均值与方差
   % Imatch=bw1
    matchgray=rgb2gray(Imatch)
    umatch=mean2(matchgray)
    DImatch=0.0
    for i=1:32
    for j=1:32
    Imatchdouble=double(matchgray(i,j))
    DImatch=DImatch+(Imatchdouble-umatch)^2
    end
    end
    DImatchbiao=(DImatch/768)^(1/2)
    %灰度标准化
    rateIm=80/DImatchbiao
    for i=1:32
    for j=1:32
    Imean(i,j)=rateIm*(matchgray(i,j)-umatch)+128
    end
    end
    %匹配过程,求标准化后模板的方差
    uI=mean2(Imean)
    DImean=0.0
    for i=1:32
    for j=1:32
    Idouble=double(Imean(i,j))
    DImean=DImean+(Idouble-uI)^2
    end
    end
    DIbiao=(DImean/768)^(1/2)
    %求标准化后待检测人脸的方差
    umatch=mean2(matchgray)
    DImatch=0.0
    for i=1:32
    for j=1:32
    Imatchdouble=double(matchgray(i,j))
    DImatch=DImatch+(Imatchdouble-umatch)^2
    end
    end
    DImatchbiao=(DImatch/768)^(1/2)
    %相关系数
    covarience=0.0
    for i=1:32
    for j=1:32
    Idouble=double(Imean(i,j))
    Imatchdouble=double(matchgray(i,j))
    covarience=covarience+(Imatchdouble-umatch)*(Idouble-uI)
    end
    end
    r=covarience/(768*DIbiao*DImatchbiao)
    if r>0.6%%%%%%%%%%%%%%%%%%%%匹配成功

%%%%%%%%%%%%plot
           [l,c]=size()
         for i=1:100
            for j=1:64
                if BWfill(i,j)==1
                    x=i+x
                    y=j+y
                    n=n+1
                end
            end
         end
            xl=x/n
            yl=y/n
         for i=39:79
            for j=10:50
               bwfill0(i,j)=0
            end
         end
            for i=10:50
                  gray1(39,i)=0
            end
            for i=10:50
                gray1(79,i)=0
            end
            for j=39:79
                 gray1(j,10)=0
            end
            for j=39:79
                 gray1(j,50)=0
            end
    end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -