OpenCV代码提取:遍历指定目录下指定文件的实现

OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便,这里将OpenCV 2.4.9中相关的函数给提取了出来,适合在Windows 64bits上使用。

directory.hpp:

#ifndef FBC_CV_DIRECTORY_HPP_
#define FBC_CV_DIRECTORY_HPP_

// reference: include/opencv2/contrib/contrib.hpp (2.4.9)

#ifndef __cplusplus
	#error directory.hpp header must be compiled as C++
#endif

#include <vector>
#include "core/fbcdef.hpp"

namespace fbc {

class FBC_EXPORTS Directory {
public:
	std::vector<std::string> GetListFiles(const std::string& path, const std::string & exten = "*", bool addPath = true);
	std::vector<std::string> GetListFilesR(const std::string& path, const std::string & exten = "*", bool addPath = true);
	std::vector<std::string> GetListFolders(const std::string& path, const std::string & exten = "*", bool addPath = true);
};

}

#endif // FBC_CV_DIRECTORY_HPP_
directory.cpp:

#include <windows.h>
#include "directory.hpp"

// reference: contrib/src/inputoutput.cpp (2.4.9)

namespace fbc{

	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;
		WIN32_FIND_DATAA FindFileData;
		HANDLE hFind;

		hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
		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;
					fname = FindFileData.cFileName;

					if (addPath) {
						list.push_back(path + "/" + std::string(fname));
					} else {
						list.push_back(std::string(fname));
					}
				}
			} while (FindNextFileA(hFind, &FindFileData));

			FindClose(hFind);
		}

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

	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();

		WIN32_FIND_DATAA FindFileData;
		HANDLE hFind;

		hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
		if (hFind == INVALID_HANDLE_VALUE) {
			return list;
		} else {
			do {
				if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
					strcmp(FindFileData.cFileName, ".") != 0 &&
					strcmp(FindFileData.cFileName, "..") != 0) {
					char* fname;
					fname = FindFileData.cFileName;

					if (addPath) {
						list.push_back(path + "/" + std::string(fname));
					} else {
						list.push_back(std::string(fname));
					}
				}
			} while (FindNextFileA(hFind, &FindFileData));

			FindClose(hFind);
		}

		return list;
	}
}
测试代码:test_directory.cpp:

#include <string>
#include <vector>
#include <iostream>
#include "directory.hpp"
#include "test_directory.hpp"

int test_directory_GetListFiles()
{
	fbc::Directory dir;

	std::string path = "E:/GitCode/OpenCV_Test/test_images";
	std::string exten = "*.jpg"; //"*";
	bool addPath = false; //true;

	// 遍历指定文件夹下的所有文件,不包括指定文件夹内的文件夹
	std::vector<std::string> filenames = dir.GetListFiles(path, exten, addPath);

	std::cout << "file names: " << std::endl;
	for (int i = 0; i < filenames.size(); i++)
		std::cout <<"    "<< filenames[i] << std::endl;

	return 0;
}

int test_directory_GetListFilesR()
{
	fbc::Directory dir;

	std::string path = "E:/GitCode/OpenCV_Test/test_images";
	std::string exten = "*";
	bool addPath = true; //false

	// 遍历指定文件夹下的所有文件,包括指定文件夹内的文件夹
	std::vector<std::string> allfilenames = dir.GetListFilesR(path, exten, addPath);

	std::cout << "all file names: " << std::endl;
	for (int i = 0; i < allfilenames.size(); i++)
		std::cout <<"    "<< allfilenames[i] << std::endl;

	return 0;
}

int test_directory_GetListFolders()
{
	fbc::Directory dir;

	std::string path = "E:/GitCode/OpenCV_Test/test_images";
	std::string exten = "*d*"; //"*"
	bool addPath = false; //true

	// 遍历指定文件夹下的所有文件夹,不包括指定文件夹下的文件
	std::vector<std::string> foldernames = dir.GetListFolders(path, exten, addPath);

	std::cout << "folder names: " << std::endl;
	for (int i = 0; i < foldernames.size(); i++)
		std::cout << "    "<< foldernames[i] << std::endl;

	return 0;
}

GitHubhttps://github.com/fengbingchun/OpenCV_Test

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值