OpenCV遍历文件夹下所有的图片

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_30460949/article/details/89392247