opencv获取文件夹下所有指定后缀的文件

  该代码主要实现获取指定文件夹及其子文件夹下的指定后缀的所有文件,并以输出其文件名。

  如果你的opencv是2.x版本,直接使用下面代码:

#include <iostream>
#include "opencv2/opencv.hpp"
#include <string>    
#include <vector>    
#include <numeric>  
#include <sys/types.h>
#include <windows.h>
#include <tchar.h>

int main(int *argc,char **argv)
{
	int AllVideoFrameLen = 0;
	//string videoDir=argv[1];
	//string videoProperty=argv[2];
	string videoDir = "你的文件夹;
	string videoProperty ="*.avi";
	Directory dir;
	vector<string> FileList; vector<string> DirList;
	FileList = dir.GetListFilesR (videoDir, "*", true);
	cout << "Dir Num:" << DirList.size() << endl;
	if (FileList.size() > 0){
			for (int k = 0; k < FileList.size(); k++)
			{
				cout << FileList[k] << endl;	
			}	
	}
}

如果你的opencv版本为3.x,由于3.x版本中删掉了Directory 类,我们得在开元的opencv2中找到Directory 的相关实现,并保存到一个工程里面。(该部分主要参考该博客的处理方法

(1)创建名contrib.hpp文件,并在该文件中添加下面代码:

#pragma once
#ifndef __OPENCV_CONTRIB_HPP__
#define __OPENCV_CONTRIB_HPP__
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
class CV_EXPORTS Directory
{
public:
	static std::vector<std::string> GetListFiles(const std::string& path, const std::string & exten = "*", bool addPath = true);
	static std::vector<std::string> GetListFilesR(const std::string& path, const std::string & exten = "*", bool addPath = true);
	static std::vector<std::string> GetListFolders(const std::string& path, const std::string & exten = "*", bool addPath = true);
};
#endif

  (2)创建名为contrib.cpp文件,并在该文件中添加下面代码:

#include "contrib.hpp"
//#include <cvconfig.h>
#if defined(WIN32) || defined(_WIN32)
#include <windows.h>
#include <tchar.h>
#else
#include <dirent.h>
#endif
std::vector<std::string> Directory::GetListFiles(const std::string& path, const std::string & exten, bool addPath)
{
	std::vector<std::string> list;
	list.clear();
	std::string path_f = path + "/" + exten;
#ifdef WIN32
#ifdef HAVE_WINRT
	WIN32_FIND_DATAW FindFileData;
#else
	WIN32_FIND_DATAA FindFileData;
#endif
	HANDLE hFind;
#ifdef HAVE_WINRT
	wchar_t wpath[MAX_PATH];
	size_t copied = mbstowcs(wpath, path_f.c_str(), MAX_PATH);
	CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
	hFind = FindFirstFileExW(wpath, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
#else
	hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
#endif
	if (hFind == INVALID_HANDLE_VALUE)
	{
		return list;
	}
	else
	{
		do
		{
			if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_NORMAL ||
				FindFileData.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE ||
				FindFileData.dwFileAttributes == FILE_ATTRIBUTE_HIDDEN ||
				FindFileData.dwFileAttributes == FILE_ATTRIBUTE_SYSTEM ||
				FindFileData.dwFileAttributes == FILE_ATTRIBUTE_READONLY)
			{
				char* fname;
#ifdef HAVE_WINRT
				char fname_tmp[MAX_PATH] = { 0 };
				size_t copied = wcstombs(fname_tmp, FindFileData.cFileName, MAX_PATH);
				CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
				fname = fname_tmp;
#else
				fname = FindFileData.cFileName;
#endif
				if (addPath)
					list.push_back(path + "/" + std::string(fname));
				else
					list.push_back(std::string(fname));
			}
		}
#ifdef HAVE_WINRT
		while (FindNextFileW(hFind, &FindFileData));
#else
		while (FindNextFileA(hFind, &FindFileData));
#endif
		FindClose(hFind);
	}
#else
	(void)addPath;
	DIR *dp;
	struct dirent *dirp;
	if ((dp = opendir(path.c_str())) == NULL)
	{
		return list;
	}
	while ((dirp = readdir(dp)) != NULL)
	{
		if (dirp->d_type == DT_REG)
		{
			if (exten.compare("*") == 0)
				list.push_back(static_cast<std::string>(dirp->d_name));
			else
				if (std::string(dirp->d_name).find(exten) != std::string::npos)
					list.push_back(static_cast<std::string>(dirp->d_name));
		}
	}
	closedir(dp);
#endif
	return list;
}
std::vector<std::string> Directory::GetListFolders(const std::string& path, const std::string & exten, bool addPath)
{
	std::vector<std::string> list;
	std::string path_f = path + "/" + exten;
	list.clear();
#ifdef WIN32
#ifdef HAVE_WINRT
	WIN32_FIND_DATAW FindFileData;
#else
	WIN32_FIND_DATAA FindFileData;
#endif
	HANDLE hFind;
#ifdef HAVE_WINRT
	wchar_t wpath[MAX_PATH];
	size_t copied = mbstowcs(wpath, path_f.c_str(), path_f.size());
	CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
	hFind = FindFirstFileExW(wpath, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
#else
	hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
#endif
	if (hFind == INVALID_HANDLE_VALUE)
	{
		return list;
	}
	else
	{
		do
		{
#ifdef HAVE_WINRT
			if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
				wcscmp(FindFileData.cFileName, L".") != 0 &&
				wcscmp(FindFileData.cFileName, L"..") != 0)
#else
			if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
				strcmp(FindFileData.cFileName, ".") != 0 &&
				strcmp(FindFileData.cFileName, "..") != 0)
#endif
			{
				char* fname;
#ifdef HAVE_WINRT
				char fname_tmp[MAX_PATH];
				size_t copied = wcstombs(fname_tmp, FindFileData.cFileName, MAX_PATH);
				CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
				fname = fname_tmp;
#else
				fname = FindFileData.cFileName;
#endif
				if (addPath)
					list.push_back(path + "/" + std::string(fname));
				else
					list.push_back(std::string(fname));
			}
		}
#ifdef HAVE_WINRT
		while (FindNextFileW(hFind, &FindFileData));
#else
		while (FindNextFileA(hFind, &FindFileData));
#endif
		FindClose(hFind);
	}
#else
	(void)addPath;
	DIR *dp;
	struct dirent *dirp;
	if ((dp = opendir(path_f.c_str())) == NULL)
	{
		return list;
	}
	while ((dirp = readdir(dp)) != NULL)
	{
		if (dirp->d_type == DT_DIR &&
			strcmp(dirp->d_name, ".") != 0 &&
			strcmp(dirp->d_name, "..") != 0)
		{
			if (exten.compare("*") == 0)
				list.push_back(static_cast<std::string>(dirp->d_name));
			else
				if (std::string(dirp->d_name).find(exten) != std::string::npos)
					list.push_back(static_cast<std::string>(dirp->d_name));
		}
	}
	closedir(dp);
#endif
	return list;
}
std::vector<std::string> Directory::GetListFilesR(const std::string& path, const std::string & exten, bool addPath)
{
	std::vector<std::string> list = Directory::GetListFiles(path, exten, addPath);
	std::vector<std::string> dirs = Directory::GetListFolders(path, exten, addPath);
	std::vector<std::string>::const_iterator it;
	for (it = dirs.begin(); it != dirs.end(); ++it)
	{
		std::vector<std::string> cl = Directory::GetListFiles(*it, exten, addPath);
		list.insert(list.end(), cl.begin(), cl.end());
	}
	return list;
}

 (3)则测试主函数为:

#include <iostream>
#include "opencv2/opencv.hpp"
#include <string>    
#include <vector>    
#include <numeric>  
#include <sys/types.h>
#include <windows.h>
#include <tchar.h>
#include"contrib.hpp"    //注意,这里是和opencv2.xb头文件不同的地方
int main(int *argc,char **argv)
{
	int AllVideoFrameLen = 0;
	//string videoDir=argv[1];
	//string videoProperty=argv[2];
	string videoDir = "你的文件夹;
	string videoProperty ="*.avi";
	Directory dir;
	vector<string> FileList; vector<string> DirList;
	FileList = dir.GetListFilesR (videoDir, "*", true);
	cout << "Dir Num:" << DirList.size() << endl;
	if (FileList.size() > 0){
			for (int k = 0; k < FileList.size(); k++)
			{
				cout << FileList[k] << endl;	
			}	
	}
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值