www.gusucode.com > 2dpca的matlab源代码 > 2dpca的matlab源代码/Untitled.m

    %本程序为2DPCA进行人脸识别,利用ORL标准图像库进行训练和测试,每个类中的前5副用于训练,
%后5副用于测试结果,所以,选择训练和测试样本的路径时,选择同一个文件夹即可。
%本程序所采用的方法为“基于二维PCA的类内平均脸方法”
clear all;clc;
%选择训练样本路径
TrainDatabasePath = uigetdir('D:\Matlab编程实例\pca和fisher算法用于人脸识别\2dpca的matlab源代码\orl_faces',...
    'Select training database path' );
%选择测试样本路径
TestDatabasePath = uigetdir('D:\Matlab编程实例\pca和fisher算法用于人脸识别\2dpca的matlab源代码\orl_faces',...
    'Select test database path');
TrainFiles = dir(TrainDatabasePath);
class_Number = 0;
s=size(TrainFiles,1);
%计算训练样本个数
for i = 1:size(TrainFiles,1)
    if not(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'README'))
        class_Number = class_Number + 1; % Number of all images in the training database
    end
end
%读取训练集第一个图像,得到其尺寸,初始化图像矩阵
str = strcat(TrainDatabasePath,'\s1\1.pgm');
img = imread(str);
[irow,icol] = size(img);
A=zeros(irow,icol,2);
%%%%%%%%%%%%%合计有Train_Number人的目录,每个目录存放某人的10幅人脸图像,取前n副图像做训练样本
n=5;
for i = 1 : class_Number
    topdir = int2str(i);
    topdir = strcat(TrainDatabasePath,'\s',topdir);
    for j= 1 : n
        str = int2str(j);
        str = strcat(topdir,'\',str,'.pgm');
        img = imread(str);
        A(:,:,n*(i-1)+j) = img;
    end
end
%得到训练样本的个数Train_Number
Train_Number = size(A,3);
%求所有训练样本向量的均值 M ,即计算“每类训练样本的类内平均脸”
M=mean(A,3);
%%%%%%%%%%%%%%%%%%%%%%%%%求图像散布矩阵Gt,即计算人脸样本的协方差矩阵
Gt=zeros(icol,icol);
for i = 1 : Train_Number
    temp = A(:,:,i)-M;
    Gt =  Gt + temp'*temp;
end
Gt=Gt/Train_Number;
%%%%%%%%%%%%%%%%%%%%%%%%%
d = 10;
[V D] = eigs(Gt,d);
%PCA空间投影图像
ProjectedImages = zeros(irow,d);
for i = 1 : Train_Number
    ProjectedImages(:,:,i) = A(:,:,i)*V;
end
%已识别测试集的数目Recnum
Recnum=0;
for i = 1 : class_Number
    topdir = int2str(i);
    topdir = strcat(TestDatabasePath,'\s',topdir);
    for j= n+1:10
        str = int2str(j);
        TestImage = strcat(topdir,'\',str,'.pgm'); %测试样本路径
        %测试样本原始数据
        im = imread(TestImage);
        %测试样本的投影
        ProjectedTestImage = double(im)*V;
        gc=[];
        for i=1 : Train_Number
            temp = norm( ProjectedTestImage - ProjectedImages( :,:,i ),'fro');
            gc=[gc temp];
        end
        [dist_min , Recognized_index1] = min(gc);
        Recognized_index1 = floor((Recognized_index1-1)/n)+1;
        OutputName = Recognized_index1;
        OutputName =strcat(TestDatabasePath,'\s',int2str(OutputName));
        disp(['被测试对象:',TestImage]);
        %如果测试样本分类正确,则 Recnum加1
        if(strcmp(OutputName,topdir)==1)
            Recnum = Recnum+1;
            disp('识别成功!');
        else
            str=strcat(OutputName,'\','1.pgm');
            disp('识别失败!!!');
            subplot(121);imshow(TestImage);title('被识别图像');
            subplot(122);imshow(str);title('被误识别为');
            pause;
        end
    end
end
str=strcat('总识别数目: ', int2str(Recnum));
disp(str );
disp(['正确识别率:',num2str(Recnum/50*100),'%']);