在做计算机视觉的研究中,很多测试样本提供的都是图像序列,那么怎样在不保存一个个图像名的情况下,读入一个文件夹下的图像序列,window下提高能够了一个很好的方法。
首先我们先了解下WIN32_FIND_DATA的结构。
WIN32_FIND_DATA结构描述了一个有FindFirsFile,FindFirstFileEx,或FindNextFile函数查找到的文件信息,其定义结构如下:
typedef struct_WIN32_FIND_DATA{
DWORD dwFileAttributes;//文件属性
FILETIME ftCreationTime;//文件创建时间
FILETIME ftLastAccessTime;//文件最后一次访问时间
FILETIME ftLastWriteTime;//文件最后一次修改时间
DWORD nFileSizeHight;//文件长度高32位
DWORD nFileSizeLow;//文件长度低32位
DWORD dwReserved0;//系统保留
DWORD dwReserved1;//系统保留
TCHAR cFileName[MAX_PATH];//长文件名
TCHAR cAltemateFileName[14];//8.3文件格式名
} WIN32_FIND_DATA,*PWN32_FIND_DATA;
可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把操作文件的相关属性读到WIN32_FIND_DATA结构体中去;如下
WIN32_FIND_DATA f;
HANDLE hFind = FindFirstFile(".\data",&f);
在使用这个结构体时不能手工谢盖这个结构体中的任何数据,结构体对于开发人员来说只能作为一个只读数据,其所有的成员变量都是由系统完成填写。在MSDN帮助中可以查找出WIN32_FIND_DATA结构的更加详细的信息。
if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
这个判断语句是通过 将dwFileAttributes和FILE_ATTRIBUTE_DIRECTORY做位的与运算
来判断所找到的项目是不是文件夹
因为 FindFirstFile返回的 findData 中 dwFileAttributes项的值
可能是
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_TEMPORARY
中几项的组合值
findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
的结果只能是两种:
FILE_ATTRIBUTE_DIRECTORY 非零值 ,if条件是真
0 ,if条件是假
通过 findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
可以判断 dwFileAttributes项的值中是否 FILE_ATTRIBUTE_DIRECTORY,即判断所找到的项目是不是文件夹
这种对位运算结果的判断,在windows编程中有很多
如窗体属性,鼠标按键
下面将给出window下打开文件下的图像序列的程序
/* 在VS2012下要用下面的方式读入图像组,就要在头文件中加入<windows.h>
* 另外还会提示char* 与LPCTSTR 不兼容,需要变成w_char
* 解决方式就是在项目属性中的常规下的字符集中的使用Unicode选项变成使用多字节字符集
*/
void readImageSequenceFiles(char* imgFilePath,vector <string> &imgNames)
{
imgNames.clear();
char tmpDirSpec[MAX_PATH+1];
sprintf (tmpDirSpec, "%s/*", imgFilePath);//*任意文件名
//size_t len = strlen(tmpDirSpec) + 1;//将char* 类型转换成wchar_t类型;
//size_t converted = 0;
//wchar_t *WStr;
//WStr=(wchar_t*)malloc(len*sizeof(wchar_t));
//mbstowcs_s(&converted, WStr, len, tmpDirSpec, _TRUNCATE);
WIN32_FIND_DATA f;
//根据当前文件的存放路径查找该文件来把待操作文件的相关属性读到f中
HANDLE h = FindFirstFile(tmpDirSpec , &f);
if(h != INVALID_HANDLE_VALUE)
{
FindNextFile(h, &f); //read ..
FindNextFile(h, &f); //read .
do
{
imgNames.push_back(f.cFileName);
} while(FindNextFile(h, &f));
}
FindClose(h);
}