StaDir.h文件
#pragma once
#include "browsedir.h"
class CStaDir :
public CBrowseDir
{
public:
CStaDir(void);
~CStaDir(void);
int m_nFileCount; //保存文件个数
int m_nSubdirCount; //保存目录个数
int GetFileCount(void);
int GetSubdirCount(void);
virtual bool ProcessFile(const char* filename);
virtual void ProcessDir(const char* currentdir, const char* parentdir);
};
StaDir.cpp文件
#include "StdAfx.h"
#include "StaDir.h"
CStaDir::CStaDir(void)
: m_nFileCount(0)
, m_nSubdirCount(0)
{
}
CStaDir::~CStaDir(void)
{
}
/************************************************************************/
/* 返回文件个数 */
/************************************************************************/
int CStaDir::GetFileCount(void)
{
return m_nFileCount;
}
/************************************************************************/
/* 返回子目录个数 */
/************************************************************************/
int CStaDir::GetSubdirCount(void)
{
//因为进入初始目录时,也会调用函数ProcessDir,所以减1后才是真正的子目录个数
return m_nSubdirCount-1;
}
/************************************************************************/
/* 覆写虚函数procefile,没调用一次,文件个数加1 */
/************************************************************************/
bool CStaDir::ProcessFile(const char* filename)
{
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
}
/************************************************************************/
/* 覆写虚函数ProcessDir,没调用一次,目录个数加1 */
/************************************************************************/
void CStaDir::ProcessDir(const char* currentdir, const char* parentdir)
{
m_nSubdirCount++;
CBrowseDir::ProcessDir(currentdir,parentdir);
}
BrowseDir.cpp
#pragma once
/************************************************************************/
/* 遍历目录中的所有文件 */
/************************************************************************/
#include <stdlib.h>
#include <direct.h>
#include <string>
#include <io.h>
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class CBrowseDir
{
public:
CBrowseDir(void);
~CBrowseDir(void);
char m_szInitDir[_MAX_PATH]; //初始目录的绝对路径,以'\'结尾
bool SetInitDir(const char* dir);
bool BeginBrowse(const char* filespec);
bool BrowseDir(const char* dir, const char* filespec);
virtual bool ProcessFile(const char* filename);
virtual void ProcessDir(const char* currentdir,const char *parentdir);
vector<string> BeginBrowseFilenames(const char* filespec);
vector<string> GetDirFilenames(const char* dir, const char* filespec);
};
BrowseDir.cpp文件
#include "StdAfx.h"
#include "BrowseDir.h"
CBrowseDir::CBrowseDir(void)
{
getcwd(m_szInitDir,_MAX_PATH); //用当前目录初始化m_szInitDir
//如果目录的最后一个字母不是'\',则在最后加上一个'\'
int len = strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
{
strcat(m_szInitDir,"\\");
}
}
CBrowseDir::~CBrowseDir(void)
{
}
/************************************************************************/
/* 设置初始目录为dir,如果返回false,表示目录不可用 */
/************************************************************************/
bool CBrowseDir::SetInitDir(const char* dir)
{
//先把dir转换为绝对路径
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
{
return false;
}
//判断目录是否存在
if (_chdir(m_szInitDir) != 0)
{
return false;
}
//如果目录的最后一个字母不是'\',则在最后加上一个'\'
int len = strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
{
strcat(m_szInitDir,"\\");
}
return true;
}
/************************************************************************/
/* 开始遍历初始目录及其子目录下由filespec指定类型的文件,
filespec开始使用通配符*?,不能包含路径。
如果返回false,表示遍历过程被用户终止*/
/************************************************************************/
bool CBrowseDir::BeginBrowse(const char* filespec)
{
ProcessDir(m_szInitDir,NULL);
return BrowseDir(m_szInitDir,filespec);
}
/************************************************************************/
/* 遍历目录dir下由filespec指定的文件,
对于子目录,采用迭代的方法
如果返回false,表示终止遍历文件*/
/************************************************************************/
bool CBrowseDir::BrowseDir(const char* dir, const char* filespec)
{
_chdir(dir);
//首先查找dir中符合要求的文件
long hFile;
_finddata_t fileinfo;
if ((hFile = _findfirst(filespec,&fileinfo)) != -1)
{
do
{
//检查是不是目录,如果不是,则进行处理
if (!(fileinfo.attrib & _A_SUBDIR))
{
char filename[_MAX_PATH];
strcpy(filename,dir);
strcat(filename,fileinfo.name);
if (!ProcessFile(filename))
{
return false;
}
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
//查找dir中的子目录,因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
//当前目录,因此还要重新设置当前目录为dir
//执行过_findfirst后,可能系统记录下了相关信息,因此改变目录,对_findnext没有影响
_chdir(dir);
if ((hFile = _findfirst("*.*",&fileinfo)) != -1)
{
do
{
//检查是不是目录,如果是,再检查是不是.或 ..,如果不是,进行迭代
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name,".")!=0
&& strcmp(fileinfo.name,"..")!= 0)
{
char subdir[_MAX_PATH];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
ProcessDir(subdir,dir);
if (!BrowseDir(subdir,filespec))
{
return false;
}
}
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
return true;
}
/************************************************************************/
/* 函数BrowseDir每找到一个文件,就调用ProcessFile,
并把文件名作为参数传递下去
如果返回false,表示终止遍历文件,用户可以覆写该函数,加入自己的处理代码*/
/************************************************************************/
bool CBrowseDir::ProcessFile(const char* filename)
{
return true;
}
void CBrowseDir::ProcessDir(const char* currentdir,const char *parentdir)
{
}
vector<string> CBrowseDir::BeginBrowseFilenames(const char* filespec)
{
ProcessDir(m_szInitDir,NULL);
return GetDirFilenames(m_szInitDir,filespec);
}
vector<string> CBrowseDir::GetDirFilenames(const char* dir, const char* filespec)
{
_chdir(dir);
vector<string>filename_vector;
filename_vector.clear();
//首先查找dir中符合要求的文件
long hFile;
_finddata_t fileinfo;
if ((hFile = _findfirst(filespec,&fileinfo)) != -1)
{
do
{
//检查是不是目录
//如果不是,则进行处理
if (!(fileinfo.attrib & _A_SUBDIR))
{
char filename[_MAX_PATH];
strcpy(filename,dir);
strcat(filename,fileinfo.name);
filename_vector.push_back(filename);
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
//查找dir中的目录,因为在处理dir中的文件时,派生类的ProcessFile有可能改变了当前目录,
//因此还要重新设置当前目录为dir,执行过_findfirst后,可能系统记录下了相关信息,因此改变了目录对_findnext没有影响
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//检查是不是目录,如果是,再检查是不是.或..,如果不是,则进行迭代
if (fileinfo.attrib & _A_SUBDIR)
{
if (strcmp(fileinfo.name,".")!=0
&& strcmp(fileinfo.name,"..")!=0)
{
char subdir[_MAX_PATH];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
ProcessDir(subdir,dir);
vector<string>tmp = GetDirFilenames(subdir,filespec);
for (vector<string>::iterator it = tmp.begin(); it<tmp.end(); it++)
{
filename_vector.push_back(*it);
}
}
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
return filename_vector;
}
调用函数
void CsysDlg::OnBnClickedOpen()
{
// TODO: Add your control notification handler code here
char cBuf[256];
IplImage *pSourcImg,*pSegImg=NULL;
int nWidth,nHeight,nSum,i,j,nInder,nCount=0;
float fRate;
const char *fname;
CStaDir statdir;
strcpy(cBuf,"E:\\2012");
if (!statdir.SetInitDir(cBuf)) //设置要遍历的目录
{
return;
}
//开始遍历,并计算,把值及文件名写入
vector<string>file_vec = statdir.BeginBrowseFilenames("*.jpg");
statdir.BeginBrowse("*.jpg");
ofstream outfile;
outfile.open("D:\\result.csv",ios::out);
for (vector<string>::const_iterator it=file_vec.begin(); it<file_vec.end(); ++it)
{
fname = it->data();
pSourcImg = cvLoadImage(fname,1);
nWidth = pSourcImg->width;
nHeight = pSourcImg->height;
if(pSegImg == NULL)
{
pSegImg = cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
}
SegmentationImg(pSourcImg, pSegImg);
nSum = 0;
for (i=0;i<nHeight;i++)
{
nInder = i*nWidth;
for (j=0;j<nWidth;j++)
{
nSum += pSegImg->imageData[nInder+j] & 0x01;
}
}
fRate = (float)nSum / (float)(nWidth*nHeight);
outfile<<*it<<","<<fRate<<endl;
cvReleaseImage(&pSourcImg);
//outfile<<*it<<endl;
nCount++;
}
outfile.close();
}