OpenCV代码提取:遍历指定目录下指定文件的实现
前言
OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便,这里将OpenCV 2.4.9中相关的函数给提取了出来,适合在Windows 64bits上使用。
不过,笔者在opencv2.4.10版本中并没有找到相关的文件。
实现代码
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; }
参考
1.大牛源链接
完
各美其美,美美与共,不和他人作比较,不对他人有期待,不批判他人,不钻牛角尖。
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】