www.pudn.com > Recogniztion_2.rar > ReadDB.m


function [X,XClass,ImgSize,ReadTime] = ReadDB(sDatabase,sOrder);  
% 
% 根据数据库路径sDatabase和序列sOrder读取图像文件。 
% 返回图片按列堆积后形成的训练样本矩阵X以及每一列的类别数组XClass, 
% 即矩阵X的每一列是一幅图片,X的第i列的类别是XClass(i),ImgSize(1)是图片的行数,ImgSize(2)是列数。 
% 所有图片的大小必须一致。 
% 
% 读取文件后的数据保存在一个.mat文件中,下次读取的时候如果sDatabase和sOrder一样时,则直接从.mat文件读出数据。 
% 
% 数据库中的图片文件名字必须符合: 
% 00101.bmp 
% 00102.bmp 
% 00201.bmp 
% 00202.bmp 
% ... 
% 即前三位是每个人类别标记,可以不连续但必须是数字。后两位是同一个人中的不同样本标志。 
% 
% Author : kk.h 
% Date : 2004.5.15 
% Email : kkcocoon@163.com 
% SUN YAT-SEN UNIVERSITY  
% 
 
BTime = clock; 
 
% clear; 
% clc; 
% sDatabase = 'D:\kk.h\study\人脸库\ORL\92x112\';  
% sOrder = '1';  
 
% ----------------------------------------------------------------------------------------------------------- 
% 得到相应的.mat文件 
ssDatabase = sDatabase; 
ssDatabase = strrep(ssDatabase,':','_'); 
ssDatabase = strrep(ssDatabase,'\','_'); 
 
sMatFile = fullfile('mat',[ssDatabase '_' sOrder '.mat']); 
 
% 如果相应的.mat文件存在,直接load该文件,得到变量返回。不必重新读取 
dirMatFile = dir(sMatFile); 
if size(dirMatFile,1)~=0 
    load(sMatFile); 
    ReadTime = etime(clock,BTime); 
    return; 
end; 
 
% ----------------------------------------------------------------------------------------------------------- 
% 根据数据库路径sDatabase和序列sOrder读取图像文件。 
FileList = dir(sDatabase); 
 
% 文件个数。包含 当前目录"." 和 上一级目录".." 
FileCount = size(FileList,1); 
 
% sOrder = '1,2,3,4,5,6,7,8,9,10,11' 
% ssOrder = '01,02,03,04,05,06,07,08,09,010,011,' 
ssOrder = strrep(sOrder,',',',0'); 
ssOrder = ['0' ssOrder ','];  
 
NN = 0; 
ImgCount = 0; % 图片数 
for (i=1:FileCount) 
     
    if length(FileList(i).name)<5  
        continue; 
    end; 
     
    if (findstr([FileList(i).name(4:5) ','],ssOrder)) 
         img = im2double(imread([sDatabase FileList(i).name])); 
 
         % 以第一张图片的大小作为标准大小 
         if (NN==0) 
             ImgSize = size(img); 
             NN = prod(ImgSize); 
         end 
          
         ImgCount = ImgCount + 1;  
          
         % reshape是按列堆成一列的向量,不是按行,但这个没关系 
         img_col = reshape(img,NN,1); 
         X(:,ImgCount) = img_col; 
          
         % 前三位是类别标志 
         XClass(ImgCount) = str2num(FileList(i).name(1:3)); 
    end 
end 
 
% 所用总时间 
ReadTime = etime(clock,BTime); 
 
% ----------------------------------------------------------------------------------------------------------- 
% 保存结果。 
 
% 如果mat的文件夹不存在 
if size(dir('mat'),1)==0 
  mkdir('mat'); 
end; 
 
save(sMatFile,'X','XClass','ImgSize');