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),'%']);