void face::read_img_yalefacesA() {
GetFileList( img_folder,"AllDir",".bmp","outyalefacesA.txt",img_name,img_lable);
}
/**===============从一个文件夹(的子文件夹*9----否则类别标签无效)中读取所有满足后缀为PostfixType的文件名=========
* FileDir代表文件夹路径名
* PostfixType代表目标文件后缀,例如bmp,如果为NO,则代表不检查后缀
* FileListType代表是否读取子文件夹。0,代表不读取子文件夹;1,代表读取子文件夹
* FileNum代表目标文件数目
* img_name 保存路径名
* img_lable 保存文件的父文件夹尾数数字(设定最多最后2位是要获得的数字,利用yale09\08.bmp,获得数字9)
*/
void face::GetFileListInOneDir( string FileDir, string PostfixType,
const int &FileListType, int &FileNum, ofstream &fop,
string houzhui,string subhouzhui,
vector<string>& img_name,vector<int>& img_lable)
//===========If FileListType = 0; just get current file list in current dir, not consider subdir;
//===========if FileListType != 1, Get All FileList in this dir, including subdir;
{
struct _finddata_t fileinfo;
int hFile = 0;
string FileDirTemp = FileDir;
cout<<"FileDirTemp"<<FileDirTemp<<endl;
FileDirTemp +="\\";
FileDirTemp += houzhui;
cout<<"FileDirTemp += houzhui"<<FileDirTemp<<endl;
if( (hFile = _findfirst( FileDirTemp.c_str(), &fileinfo) ) == -1L ){
printf("没有找到匹配的项目\n");
cout<<FileDirTemp<<endl;
cout<<"fileinfo "<<fileinfo.name<<endl;
return;
}else{
/*printf("找到匹配的项目\n");*/
//如果遍历到的是一个子文件夹
if( fileinfo.attrib &_A_SUBDIR )
{
if(FileListType != 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
{
string SubFileDir = FileDir;
SubFileDir += "\\";
SubFileDir += fileinfo.name;
GetFileListInOneDir( SubFileDir, PostfixType, FileListType, FileNum, fop, houzhui, subhouzhui,img_name,img_lable ); //递归for所有的subdir;
}
if(FileListType == 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
{
string SubFileDir = FileDir;
SubFileDir += "\\";
string FileName = fileinfo.name;
SubFileDir += FileName;
if(PostfixType == "NO"){
fop<<SubFileDir<<endl;
FileNum++;
}else{
int Pos = FileName.find(PostfixType.c_str());
if( Pos != (int)string::npos )
{
fop<<SubFileDir<<endl;
FileNum++;
}
//若没找到,则不做处理,继续外循环
}
}
}//end if a subdir;
else
{//如果遍历到的是文件,而不是文件夹----比较后缀
string FileName = fileinfo.name;
if(PostfixType == "NO"){
fop<<FileDir + "\\"+ FileName<<endl;
FileNum++;
}else{
int Pos = FileName.find(PostfixType.c_str());
if( Pos != (int)string::npos )
{
string FileDirc = FileDir;
string temp;
int numlabel = -1;
if(FileDirc.length()>=2){
//E:\face_recognizer\face_sample\CroppedYaleB\yaleB02
//上层的2位
if((FileDirc.at(FileDirc.length()-2)>'0') && (FileDirc.at(FileDirc.length()-2)<='9')){
temp = FileDirc.substr(FileDirc.length()-2,2);
numlabel = atoi(temp.c_str());
}else if((FileDirc.at(FileDirc.length()-1)>'0') && (FileDirc.at(FileDirc.length()-1)<='9')){
temp = FileDirc.substr(FileDirc.length()-1,1);
numlabel = atoi(temp.c_str());
}else{
cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
exit(-1);
}
}else{
//FileDirc.length()==1
if((FileDirc.at(0)>'0') && (FileDirc.at(0)<='9')){
temp = FileDirc.substr(FileDirc.length()-1,1);
numlabel = atoi(temp.c_str());
}else{
cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
exit(-1);
}
}
fop<<"temp.c_str() = "<<temp.c_str()<<endl;
fop<<"numlabel = "<<numlabel<<endl;
img_lable.push_back(numlabel);
fop<<FileDir + "\\"+ FileName<<endl;
img_name.push_back(FileDir + "\\"+ FileName);
FileNum++;
}
}
}
}
while( _findnext( hFile, &fileinfo ) == 0 )
{
/*printf("找到匹配的项目\n");
cout<<"fileinfo "<<fileinfo.name<<endl;*/
//========判断是否是一个subdir==========//
//如果遍历到的是一个子文件夹
//如果遍历到的是一个子文件夹
if( fileinfo.attrib &_A_SUBDIR )
{
if(FileListType != 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
{
string SubFileDir = FileDir;
SubFileDir += "\\";
SubFileDir += fileinfo.name;
cout<<"fileinfo"<<fileinfo.name<<endl;
GetFileListInOneDir( SubFileDir, PostfixType, FileListType, FileNum, fop, houzhui, subhouzhui,img_name,img_lable); //递归for所有的subdir;---------不能*.*
}if(FileListType == 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
{
string SubFileDir = FileDir;
SubFileDir += "\\";
string FileName = fileinfo.name;
SubFileDir += FileName;
cout<<"fileinfo"<<fileinfo.name<<endl;
if(PostfixType == "NO"){
fop<<SubFileDir<<endl;
FileNum++;
}else{
int Pos = FileName.find(PostfixType.c_str());
if( Pos != (int)string::npos )
{
fop<<SubFileDir<<endl;
FileNum++;
}
//若没找到,则不做处理,继续外循环
}
}
}//end if a subdir;
else
{//如果遍历到的是文件,而不是文件夹----比较后缀
string FileName = fileinfo.name;
cout<<"fileinfo "<<fileinfo.name<<endl;
if(PostfixType == "NO"){
fop<<FileDir + "\\"+ FileName<<endl;
FileNum++;
}else{
int Pos = FileName.find(PostfixType.c_str());
if( Pos != (int)string::npos )
{
string FileDirc = FileDir;
string temp;
int numlabel = -1;
if(FileDirc.length()>=2){
//E:\face_recognizer\face_sample\CroppedYaleB\yaleB02
//上层的2位
if((FileDirc.at(FileDirc.length()-2)>'0') && (FileDirc.at(FileDirc.length()-2)<='9')){
temp = FileDirc.substr(FileDirc.length()-2,2);
numlabel = atoi(temp.c_str());
}else if((FileDirc.at(FileDirc.length()-1)>'0') && (FileDirc.at(FileDirc.length()-1)<='9')){
temp = FileDirc.substr(FileDirc.length()-1,1);
numlabel = atoi(temp.c_str());
}else{
cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
exit(-1);
}
}else{
//FileDirc.length()==1
if((FileDirc.at(0)>'0') && (FileDirc.at(0)<='9')){
temp = FileDirc.substr(FileDirc.length()-1,1);
numlabel = atoi(temp.c_str());
}else{
cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
exit(-1);
}
}
fop<<"temp.c_str() = "<<temp.c_str()<<endl;
fop<<"numlabel = "<<numlabel<<endl;
img_lable.push_back(numlabel);
fop<<FileDir + "\\"+ FileName<<endl;
img_name.push_back(FileDir + "\\"+ FileName);
FileNum++;
}
}
}//end while;
}
_findclose( hFile );
}//end WF;
/**
* FileDir代表文件夹路径名
* PostfixType代表目标文件后缀,例如bmp,如果为NO,则代表不检查后缀
* CurrentDirOrAllDir代表是否读取子文件夹。"CurrentDir",代表不读取子文件夹;"CurrentDir",代表读取子文件夹
* FileNum代表目标文件数目
*/
void face::GetFileList( string FileDir, string CurrentDirOrAllDir,
string Postfix, string OutputFileList,
vector<string>& img_name,vector<int>& img_lable)
{
ofstream output( OutputFileList.c_str(), ios::out | ios::in | ios::app);
int FileListType = 0;
if( CurrentDirOrAllDir == "CurrentDir" ) FileListType = 0; //just get current filedir file list;
else if( CurrentDirOrAllDir == "AllDir" ) FileListType = 1; // get all file list, including in subdir;
else return;
cerr<<"FileCount..."<<endl;
int FileNum = 0;
GetFileListInOneDir( FileDir, Postfix, FileListType,
FileNum, output, "*.*" ,"*.*",
img_name,img_lable);
output.close();
cerr<<"<"<<FileNum<<"> Files In FileDir:===="<<FileDir<<"===="<<endl;
}//end WF;
命令行输入:E:\face_recognizer\face_sample\yalefacesA
文件夹结构:
结果:
方法二(懒汉式,确定见其中"以yaleB为例!"):
void face::read(){
cout<<"输入train样本库路径(**\\**\\):"<<endl; // 不要双斜线输入
cin>>train_folder;
cout<<train_folder<<endl;
ofstream output( "read.txt", ios::out | ios::in | ios::app);
if(train_folder == "E:\\face_recognizer\\face_sample\\CroppedYaleB"){
output<<"以yaleB为例!"<<endl;
cout<<"CroppedYaleB\yaleB14中没有.bmp文件,且,各个yaleB*中.bmp不等,不能以此读取。"<<endl;
exit(-1);
}
if(train_folder == "E:\\face_recognizer\\face_sample\\yalefacesA"){
output<<"以yaleA为例!"<<endl;
train_folder.append("\\");
char cnum[5];
char cnumsub[5];
for(int r=1; r<=15; r++){
string temp = train_folder;//copy
itoa(r,cnum,10);
if(r<10){
temp.append("0");
}
temp.append(cnum);
temp.append("\\");
for(int c=1; c<=11; c++){
string tempsub = temp;//copy
tempsub.append("s");
itoa(c,cnumsub,10);
tempsub.append(cnumsub);
output<<tempsub<<endl;
output<<r<<endl;
this->imgtrain_name.push_back(tempsub);
this->labletrain.push_back(r);
}
}
}
output.close();
}