基于PCA的人脸特征提取1

来源:互联网 发布:邯郸数据库工程师招聘 编辑:程序博客网 时间:2024/05/19 21:59

应用PCA技术来抽取人脸特征,在降低维数的同时,在一定程度上去除原始特征各维之间的相关性。

一 、生成样本矩阵

ORL人脸库共有400幅人脸图像(40人,每人10幅图像,像素为112*92),选用每个人的前5张图片作为实验的数据集,这样共有200幅样本图像。

首先要做的是将这200幅人脸图像转换为向量形式,组成样本矩阵。函数ReadFaces()用于完成这一任务

ReadFaces()依次读入样本图像(假定40个人的样本图像位于“..../ORL/”路径下,如第18人的10幅图像位于..../ORL/S18中,然后将112×92的像素按列存储为10304维的行向量作为样本矩阵FaceContainer的一个样本(一行),最后将样本矩阵保存至Mat目录下的FaceMat.mat文件。

函数具体实现如下:

function [imgRow,imgCol,FaceContainer,faceLabel]=ReadFaces(nFacesPerPerson,nPerson,bTest)
%读入ORL人脸库指定书目的人脸前五张训练
%
%输入:nFacesPerPerson*nPerson--每个人需要读入的样本数,默认值为5
%      nPerson--需要读入的人数,默认为全部40人
%      bTest--bool型的参数。默认为0,表示读入训练样本(前五张);如果为1,表示
%      读入测试样本(后五张)
%输出:FaceContainer--向量化人脸容器,nPerson*10304的2维矩阵,每行对应一个人脸
%      向量


if nargin==0
    nFacesPerPerson=5;%前五张用于训练
    nPerson=40;       %要读入的人数
    bTest=0;
elseif nargin<3
    bTest=0;
end
img=imread('E:\表情数据库\ORL\s1_1.bmp');%为计算尺寸先读入一张
[imgRow,imgCol]=size(img);


FaceContainer=zeros(nFacesPerPerson.*nPerson,imgRow.*imgCol);
faceLabel=zeros(nFacesPerPerson,1);


%读入训练数据
for i=1:nPerson
    strPath='E:\表情数据库\ORL\s';
    strPath=strcat(strPath,num2str(i),'_');
    tempStrPath=strPath;
     for j=1:nFacesPerPerson
         strPath=tempStrPath;         
         if bTest==0  %读入训练数据
             strPath=strcat(strPath,num2str(j));
         else 
             strPath=strcat(strPath,num2str(5+j));
         end
         strPath=strcat(strPath,'.bmp');
         img=imread(strPath);
         
         %把读入的图像按列存储为行向量放入向量化人脸容器对应的行中
         FaceContainer((i-1)*nFacesPerPerson+j,:)=img(:)';
         faceLabel((i-1)*nFacesPerPerson+j)=i;
     end
end
%保存人脸样本矩阵
save('../FaceMat.mat','FaceContainer')


0 0
原创粉丝点击