您的位置:首页 > 其它

基于PCA的人脸特征提取1

2014-12-04 13:46 411 查看
应用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')

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: