最近要给同学在一个自动瞄准装置的基础上做一个人脸识别模块。也是上网查阅了一些资料,经过一周的整理整合,也算是有一些收获。

首先,通过阅读网上的一些现有的程序,可以发现,人脸识别大致可以分为两种方法:

第一种是仅能够识别图片中的“人脸”,也就是说,只能识别出这张图片中有一张人脸,但是不能够识别出这张人脸是谁。这是一种比较简单的识别方式。其具有的优点是:算法简单,执行速度较快。缺点自不必说,不能识别这个人是谁,再快有什么用?但我个人认为这种方式还是有一定的用处的。如用在一些基础设备的智能化提升上,就像是在消防车上加装人脸识别模式,就可以自动搜索救人啦。当然,最关键的用处还不在于此,这种方式可以作为第二种识别方式的基础,可以提升其性能。

第一种方式的理论基础大概就是利用图片中的“肤色”进行识别,相比其他几种类似的识别方法,这段代码的识别准确性还是可以保证的,而且可以对是否识别到“人脸”进行判断,非常好用。当然,大家也可以加入“眼睛”,“鼻子”等定位来提升算法的性能。

function Rer=Re()

%Rer=0;%%%0为初始值,若成功识别,则会变为1,2,3,4

I=imread('recg.jpg');%%被识别图片存储路径,要用绝对路径!!

%%%%%%%%%%%%%%%%%算法封装,可以看作一个黑盒子%%%%%%%%%%%%%%%%
O=rgb2ntsc(I);
G=O(:,:,2);
[m n]=size(G);
U=zeros(m,n);
for i=1:m
   for j=1:n
     if G(i,j)>0.03&&G(i,j)<0.16
        U(i,j)=1;
     end
   end
end
Rer=1;
sr=strel('disk',6);%%创建圆盘半径(创建结构元素)
C=imclose(U,sr);
L=bwlabel(C);
B=regionprops(L,'area');
Se=[B.Area];
Sm=max(Se);
if Sm>m*n/27       %%%%%每个程序都会经过这个,在96行结束,未能识别人脸
  B1=bwareaopen(C,Sm);
  k_y1=m;k2=m;l2=n;
  for i=1:m
    if any(B1(i,:))==1
       k_y1=i;
       break
    end
  end
  for i=k_y1:m
    if B1(i,:)==0
      k2=i;
      break
    end
  end
  for j=1:n
    if any(B1(:,j))==1
      l_y1=j;
      break
    end
  end
  for j=l_y1:n
    if B1(:,j)==0
      l2=j;
      break
    end
  end
  k_y=k2-k_y1;
  l=l2-l_y1;
  if k_y>.5*l&&k_y<3*l   %%%%%第二层if,未能识别人脸
    I1=imcrop(B1,[l_y1 k_y1 l .4*k_y]);
    [n1 m1]=size(I1);
     L1=bwlabel(I1);
     E=regionprops(L1,'area');
     Si=[E.Area];
     Sm=max(Si);
    if Sm/(n1*m1)>.3
       B2=bwareaopen(I1,floor(.5*Sm));
       g_y1=m1;
       g2=m1;
       for j=1:m1
          if any(B2(:,j))==1
             g_y1=j;
             break
          end
       end
       for j=g_y1:m1
           if B2(:,j)==0;
              g2=j;
              break
           end
       end
       g=g2-g_y1;
       figure;
       imshow(I,'border','tight','InitialMagnification','fit');
       hold on
       h1=line([l_y1+g_y1,l_y1+g_y1+g],[k_y1,k_y1]);
       h2=line([l_y1+g_y1+g,l_y1+g_y1+g],[k_y1,k_y1+1.1*g]);
       h3=line([l_y1+g_y1+g,l_y1+g_y1],[k_y1+1.1*g,k_y1+1.1*g]);
       h4=line([l_y1+g_y1,l_y1+g_y1],[k_y1+1.1*g,k_y1]);
       h=[h1 h2 h3 h4];
       set(h,'Color',[1 0 0],'LineWidth',3);
       gfframe=getframe(gcf);
       gffim=frame2im(gfframe);
       imwrite(gffim,'recg_result.jpg','jpg'); %%%%存储图片命名,为了保存画红框的图片
       Rer=1;
       %fid=fopen('re.txt','w');
       %fprintf(fid,'%d',Rer);
       %fclose(fid);
    else%%%未能满足最近一个if判断,不能识别人脸
      figure;
      imshow(I);
      imwrite(I,'recg_result.jpg','jpg'); %%%%存储图片命名
      Rer=2;
      %fid=fopen('re.txt','w');
      %fprintf(fid,'%d',Rer);
      %fclose(fid);
    end
  else
      figure;
      imshow(I);
      imwrite(I,'recg_result.jpg','jpg'); %%%%存储图片命名
      Rer=3;
      %fid=fopen('re.txt','w');
      %fprintf(fid,'%d',Rer);
      %fclose(fid);
  end
else
  figure;
  imshow(I);
  imwrite(I,'recg_result.jpg','jpg'); %%%%存储图片命名
  Rer=4;
  %fid=fopen('re.txt','w');
  %fprintf(fid,'%d',Rer);
  %fclose(fid);
end
end

第二种识别方法是能够识别图中的“人脸”是谁。当然,这种识别方式可以以第一种识别方式作为基础,第一步判断图中是否存在人脸,第二步再判断图中的人脸是谁。这样做可以提升算法的执行效率,节约不必要的浪费。当然,这种方法的缺点就是计算量较大,运行速度有所降低。

采用这种识别方法的前提是构建“人脸”数据库,并存放相应的人脸信息。当然,如果数据库中没有这个人的信息,就不能够识别了。在做这部分的实验过程中,我采用了ORL人脸库,包含40个人每人10张人脸照片的信息,效果还是比较好,准确率能够达到80%以上。(ORL资料在后面的附件中)

function FaceRecognition 
clear  % calc xmean,sigma and its eigen decomposition   
close all 
allsamples=[];%所有训练图像

for i=1:5     
    for j=1:5         
        if(i<10) 
           a=imread(strcat('E:\ORL\00',num2str(i),'0',num2str(j),'.pgm'));      
        else 
            a=imread(strcat('E:\ORL\00',num2str(i),'0',num2str(j),'.pgm'));   
        end           
        b=a(1:112*92); % b是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右         
        b=double(b);         
        allsamples=[allsamples; b];  % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M=200    
    end 
end 
samplemean = mean(allsamples); % 平均图片,1 × N   
figure%平均图 
imshow(mat2gray(reshape(samplemean,112,92))); 
for i=1:25  
    xmean(i,:)=allsamples(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”  
end;    
% figure%平均图 
% imshow(mat2gray(reshape(xmean(1,:),112,92))); 
sigma=xmean*xmean';   % M * M 阶矩阵  
[v,d]=eig(sigma); 
d1=diag(d);  
[d2,index]=sort(d1); %以升序排序  
cols=size(v,2);% 特征向量矩阵的列数 
 
for i=1:cols       
    vsort(:,i) = v(:, index(cols-i+1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量       
    dsort(i)   = d1( index(cols-i+1) );  % dsort 保存的是按降序排列的特征值,是一维行向量  
end  %完成降序排列 %以下选择90%的能量  
dsum = sum(dsort);      
dsum_extract = 0;    
p = 0;      
while( dsum_extract/dsum < 0.9)        
    p = p + 1;           
    dsum_extract = sum(dsort(1:p));      
end 
a=1:1:25; 
for i=1:1:25 
y(i)=sum(dsort(a(1:i)) ); 
end 
figure 
y1=ones(1,25); 
plot(a,y/dsum,a,y1*0.9,'linewidth',2); 
grid 
title('前n个特征特占总的能量百分比'); 
xlabel('前n个特征值'); 
ylabel('占百分比'); 
figure 
plot(a,dsort/dsum,'linewidth',2); 
grid 
title('第n个特征特占总的能量百分比'); 
xlabel('第n个特征值'); 
ylabel('占百分比'); 
i=1;  % (训练阶段)计算特征脸形成的坐标系 
while (i<=p && dsort(i)>0)       
    base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i);   % base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,特征脸 
      i = i + 1;  
end   % add by wolfsky 就是下面两行代码,将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor   
%  
% for i=1:20 
%   figure%平均图 
% b=reshape(base(:,i)',112,92);% 
% imshow(mat2gray(b)); 
% end 
 
allcoor = allsamples * base; accu = 0;   % 测试过程

for i=1:5    
    for j=6:10 %读入5 x 5 副测试图像          
         if(i<10) 
            if(j<10) 
             a=imread(strcat('E:\ORL\00',num2str(i),'0',num2str(j),'.pgm'));      
            else 
             a=imread(strcat('E:\ORL\00',num2str(i),num2str(j),'.pgm'));      
            end 
         else 
             if(j<10) 
             a=imread(strcat('E:\ORL\0',num2str(i),'0',num2str(j),'.pgm'));      
            else 
             a=imread(strcat('E:\ORL\0',num2str(i),num2str(j),'.pgm'));      
             end 
        end       
        b=a(1:10304);         
        b=double(b);         
        tcoor= b * base; %计算坐标,是1×p阶矩阵       
        for k=1:25                 
            mdist(k)=norm(tcoor-allcoor(k,:));         
        end;          %三阶近邻    
        [dist,index2]=sort(mdist);           
        class1=floor( index2(1)/5 )+1;       
        class2=floor(index2(2)/5)+1;         
        class3=floor(index2(3)/5)+1;         
        if class1~=class2 && class2~=class3  
            class=class1;          
        elseif class1==class2           
            class=class1;          
        elseif class2==class3      
            class=class2;          
        end;          
        if class==i       
            accu=accu+1;         
        end;    
    end; 
end;   
accuracy=accu/25 %输出识别率

一些在处理问题的过程中的心得体会,希望能帮到大家。

利用MATLAB进行人脸识别相关推荐

  1. matlab:人脸识别

    matlab:人脸识别 Matlab人脸识别是一种利用计算机技术进行人脸识别的方法,其基本流程如下: 数据采集:使用数字相机或摄像机采集人脸图像,得到一系列图像数据. 图像预处理:对采集到的图像数据进 ...

  2. 基于Matlab的人脸识别登录系统

    基于Matlab的人脸识别登录系统 摘 要:人脸识别系统以人脸识别技术为核心,是一项新兴的生物识别技术,是当今比较热门的一项安全认证技术.它涉及人脸图像采集.人脸定位.人脸识别预处理.身份确认以及身份 ...

  3. 基于MATLAB的人脸识别系统[创新元素,界面GUI]

    第一章 绪论 本章提出了本文的研究背景及应用前景.首先阐述了人脸图像识别意义:然后介绍了人脸图像识别研究中存在的问题:接着介绍了自动人脸识别系统的一般框架构成:最后简要地介绍了本文的主要工作和章节结构 ...

  4. 基于matlab人脸识别论文,毕业论文--基于MATLAB的人脸识别系统设计

    毕业论文--基于MATLAB的人脸识别系统设计 毕毕 业业 设设 计计 论论 文文 题 目 基于 MATLAB 的人脸识别系统设计 学 院 电气与信息工程学院 专 业 自动化 I 摘要 人脸识别是模式 ...

  5. 基于matlab的人脸识别算法

    基于matlab的人脸识别算法 1. 主成分的数目的选取 前已指出,设有p个随机变量,便有p个主成分.由于总方差不增不减,C1,C2等前几个综合变量的方差较大,而Cp,Cp-1等后几个综合变量的方差较 ...

  6. 基于matlab的人脸五官边缘检测方法,基于MATLAB的人脸识别系统的设计

    基于MATLAB的人脸识别系统的设计(论文12000字,外文翻译,参考程序) 摘要:本文基于MATLAB平台设计了一款简单的人脸识别系统,通过USB摄像头来采集图像,经过肤色方法进行人脸检测与定位,然 ...

  7. matlab 识别调试,有关matlab的人脸识别程序,但调试是不成功

    有关matlab的人脸识别程序,但调试是不成功,求高手帮忙指点修改.在此先谢了 1.色彩空间转换 function[r,g]=rgb_RGB(Ori_Face) R=Ori_Face(:,:,1); ...

  8. java调起本地摄像头,利用openCV进行人脸识别(一)

    嗨咯,又好久没有更新了.今天写个前阵子做的人脸识别程序.该程序客户端基于Jave JFrame 客户端的主要作用是,调用电脑的摄像头(我的直接调用笔记本摄像头),然后回显摄像头录取的信息,再利用ope ...

  9. 基于MATLAB的人脸识别系统

    基于MATLAB的人脸识别系统 一.课题背景 自70年代以来.随着人工智能技术的兴起.以及人类视觉研究的进展.人们逐渐对人脸图像的机器识别投入很大的热情,并形成了一个人脸图像识别研究领域,.这一领域除 ...

最新文章

  1. 解析广泛应用于NLP的自注意力机制(附论文、源码)
  2. MySQL DATE_FORMATE函数内置字符集的坑
  3. 电信业务支撑报表开发工具解决方案
  4. 修改C盘里windows\system32\etc里面的hosts文件并保存
  5. EF批量插入太慢?那是你的姿势不对
  6. 使用ReentrantLock和Lambdas进行干净同步
  7. python面试必备-基础篇
  8. swift简介(东拼西凑,看看就的了)
  9. CPU的温度是360的准还是鲁大师的准?
  10. 怎么提前体验鸿蒙,鸿蒙OS手机版明天发布,开发者提前体验,上手操作毫无难度...
  11. MongoDB学习笔记~官方驱动的原生Curd操作
  12. Linux之重置密码的两种方法
  13. linux磁盘及文件系统管理
  14. 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针...
  15. Python路飞学城老男孩内部书籍,Python全栈开发实战pdf
  16. 微信动图表情包制作教程(ok时隔一年我来把它写完了)
  17. WIN10系统 插上耳机没声音,解决方案
  18. 实验一 网络流量捕获实验
  19. 最长无重复子数组算法-java实现
  20. Qt音视频开发7-ffmpeg音频播放

热门文章

  1. 7-6 哲哲打游戏 (25 分)
  2. 为什么共享充电宝能赚钱,共享单车不行?
  3. MATLAB学习之画图(一)
  4. 【调剂】内蒙古农业大学2020年硕士研究生调剂公告(一)
  5. 安卓自定义view系列之paint画笔类详解
  6. 做什么样的小生意适合一两个人去做,月收入在一万左右?
  7. 树莓派魔镜MagicMirror —— 7 安装MagicMirror
  8. (operational-transformations)ot算法两个字符串如何生成ot操作转换的工具
  9. openwrt 环境搭建(win10子系统)
  10. 【说一千道一万】Java内存