#include<stdio.h>
#include<windows.h>
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
struct DirList{
char table[256];
DirList *pNext;
};
DirList *first,*newlist,*last;
void AddList(char *list) //加入文件夹链表
{
newlist = new DirList;
strcpy(newlist->table,list);
newlist->pNext = NULL;
if(first == NULL) //假如文件列表为空,则第一个和最后一个节点都指向新节点
{
first = newlist;
last = newlist;
}
else //不为空,则原来最后一个节点指向新节点
{
last->pNext = newlist;
last=newlist;
}
}
//文件的全路径 的最大长度
#define MAXLENGTH 2000
//最多有多少个文件
#define MAXFILESCOUNT 500
typedef struct FILEPATH
{
char imagePath[MAXLENGTH];//图像的全路径
}FILEPATH,*PFILEPATH;
typedef struct FILESPATH
{
PFILEPATH files;
int length;
}FILESPATH,*PFILESPATH;
PFILESPATH pfilespath;
static filescount = 0 ; //对查找到的文件数 进行计数
void OpencvChinaComFindFile(char *pRoad,char *pFile) //查找文件,并把找到的文件夹放入文件夹链表
{
char FileRoad[256]={0};
char DirRoad[256]={0};
char FindedFile[256]={0};
char FindedDir[256]={0};
strcpy(FileRoad,pRoad);
strcpy(DirRoad,pRoad);
strcat(DirRoad,"\\*.*");
WIN32_FIND_DATA findData;
HANDLE hFindFile;
wchar_t wDirRoad[256];
int x =0;
while(DirRoad[x]!='\0')
{
wDirRoad[x] = DirRoad[x];
x++;
}
wDirRoad[x] = '\0';
hFindFile = FindFirstFile(DirRoad,&findData);
//hFindFile = FindFirstFile(&wDirRoad[0],&findData);
if(hFindFile != INVALID_HANDLE_VALUE)
{
do
{
if(findData.cFileName[0] == '.')
continue;
if(findData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) //假如是文件夹,则加入文件夹列表
{
strcpy(FindedDir,pRoad);
strcat(FindedDir,"\\");
//strcat(FindedDir,findData.cFileName);
int tem1 = strlen(FindedDir);
int x=0;
while(findData.cFileName[x]!='\0')
{
FindedDir[tem1+x] = findData.cFileName[x];
x++;
}
FindedDir[tem1+x] = '\0';
//加入文件夹列表
AddList(FindedDir);
memset(FindedDir,0x00,256);
}
//继续查找
}while(FindNextFile(hFindFile,&findData));
}
strcat(FileRoad,"\\");
strcat(FileRoad,pFile);
//hFindFile = FindFirstFile(FileRoad,&findData);//查找要查找的文件
wchar_t wDirRoad1[256];
x =0;
while(FileRoad[x]!='\0')
{
wDirRoad1[x] = FileRoad[x];
x++;
}
wDirRoad1[x] = '\0';
//hFindFile = FindFirstFile(&wDirRoad1[0],&findData);//查找要查找的文件
hFindFile = FindFirstFile(&FileRoad[0],&findData);//查找要查找的文件
if(hFindFile != INVALID_HANDLE_VALUE)
{
do
{
strcpy(FindedDir,pRoad);
strcat(FindedDir,"\\");
// strcat(FindedDir,findData.cFileName);
int tem1 = strlen(FindedDir);
int x=0;
while(findData.cFileName[x]!='\0')
{
FindedDir[tem1+x] = findData.cFileName[x];
x++;
}
FindedDir[tem1+x] = '\0';
//输出查找到的文件
//printf("%s\n",FindedFile);
//printf("%s here\n",FindedDir);
if(filescount>MAXFILESCOUNT)
{
printf("文件数 太多 请多分配一点内存空间来存储");
}
else
{
sprintf( pfilespath->files[filescount].imagePath, "%s" , FindedDir);
filescount++;
pfilespath->length++;
}
memset(FindedFile,0x00,256);
}while(FindNextFile(hFindFile,&findData));
}
}
int OpencvChinaComSeachFile(char *Directory,char *SeachFile)
{
DirList NewList;
strcpy(NewList.table,Directory);
NewList.pNext = NULL;
//初始化第一个和最后一个节点
last = &NewList;
first = &NewList;
while(true)
{
DirList *Find;
if(first != NULL)//假如链表不为空,提取链表的第一个节点,并把第一个节点指向第二个
{
Find = first;//提取节点
first = first->pNext;//并把第一个节点指向第二个
OpencvChinaComFindFile(Find->table,SeachFile);//在提取的节点的目录下查找文件
}
else //为空,则停止查找
{
printf("文件搜索完毕\n");
return 0;
}
}
return 0;
}
void OpencvChinaComReadImagesByID(char* dir , int beginID , int endID , char* ex)
{
for(int i=beginID;i<=endID;i++)
{
if(filescount>MAXFILESCOUNT)
{
printf("文件数 太多 请多分配一点内存空间来存储");
}
else
{
sprintf( pfilespath->files[filescount].imagePath, "%s\\%d.%s" ,dir, i,ex);
filescount++;
pfilespath->length++;
}
}
}
int main(int argc,char *argv[])
{
//#define SEARCH_ALL_FILES
#define SEARCH_BY_ID
#define SHOWIMAGE
#ifdef SEARCH_ALL_FILES
char t1[256];
char t2[256];
FILESPATH filespath;
//假设有MAXFILESCOUNT个 图像文件 如果 图像文件 更多 那么空间分配更多即可
filespath.files = (PFILEPATH)malloc(sizeof(FILEPATH)*MAXFILESCOUNT);
filespath.length = 0;
sprintf(t1,"c:\\test");
sprintf(t2,"*.jpg");
pfilespath = &filespath;
OpencvChinaComSeachFile(t1,t2);
for(int i=0;i<filespath.length;i++)
{
printf("%s\n" , filespath.files[i].imagePath);
#ifdef SHOWIMAGE
IplImage* src = cvLoadImage(filespath.files[i].imagePath);
cvNamedWindow("src");
cvShowImage("src",src);
cvWaitKey(0);
#endif
}
#endif
#ifdef SEARCH_BY_ID
char t1[256];
FILESPATH filespath;
//假设有MAXFILESCOUNT个 图像文件 如果 图像文件 更多 那么空间分配更多即可
filespath.files = (PFILEPATH)malloc(sizeof(FILEPATH)*MAXFILESCOUNT);
filespath.length = 0;
pfilespath = &filespath;
sprintf(t1,"c:\\test");
OpencvChinaComReadImagesByID(t1 , 1 , 4, "jpg");
for(int i=0;i<filespath.length;i++)
{
printf("%s\n" , filespath.files[i].imagePath);
#ifdef SHOWIMAGE
IplImage* src = cvLoadImage(filespath.files[i].imagePath);
cvNamedWindow("src");
cvShowImage("src",src);
cvWaitKey(0);
#endif
}
#endif
return 0;
}
OpenCV遍历文件夹下所有的图片
猜你喜欢
转载自blog.csdn.net/qq_30460949/article/details/89392247
今日推荐
周排行