diff --git a/modules/contrib/include/opencv2/contrib/contrib.hpp b/modules/contrib/include/opencv2/contrib/contrib.hpp index ca5c3bc76c..ae86bd0428 100644 --- a/modules/contrib/include/opencv2/contrib/contrib.hpp +++ b/modules/contrib/include/opencv2/contrib/contrib.hpp @@ -605,6 +605,14 @@ namespace cv }; CV_EXPORTS void polyfit(const Mat& srcx, const Mat& srcy, Mat& dst, int order); + + class CV_EXPORTS Directory + { + public: + static std::vector<std::string> GetListFiles ( const string& directoryName, bool addPath = true ); + static std::vector<std::string> GetListFilesR ( const string& directoryName, bool addPath = true ); + static std::vector<std::string> GetListFolders( const string& directoryName, bool addPath = true ); + }; } #include "opencv2/contrib/retina.hpp" diff --git a/modules/contrib/src/inputoutput.cpp b/modules/contrib/src/inputoutput.cpp new file mode 100644 index 0000000000..c17fae7718 --- /dev/null +++ b/modules/contrib/src/inputoutput.cpp @@ -0,0 +1,132 @@ + +#include "opencv2/contrib/contrib.hpp" + +#ifdef WIN32 + #include <windows.h> + #include <tchar.h> +#else + #include <direct.h> +#endif + +namespace cv +{ + std::vector<std::string> Directory::GetListFiles( const string& directoryName, bool addPath ) + { + std::vector<std::string> list; + list.clear(); + std::string path = directoryName + "/*"; + #ifdef WIN32 + WIN32_FIND_DATA FindFileData; + HANDLE hFind; + + hFind = FindFirstFile((LPCSTR)path.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) + { + if (addPath) + list.push_back(directoryName + "/" + FindFileData.cFileName); + else + list.push_back(FindFileData.cFileName); + } + } + while(FindNextFile(hFind, &FindFileData)); + FindClose(hFind); + } + #else + DIR *dp; + struct dirent *dirp; + if((dp = opendir(directoryName.c_str())) == NULL) + { + return list; + } + + while ((dirp = readdir(dp)) != NULL) + { + if (dirp->d_type == DT_REG) + list.push_back(static_cast<string>(dirp->d_name)); + } + closedir(dp); + #endif + + return list; + } + + std::vector<std::string> Directory::GetListFolders( const string& directoryName, bool addPath ) + { + std::vector<std::string> list; + std::string path = directoryName + "/*"; + list.clear(); + #ifdef WIN32 + WIN32_FIND_DATA FindFileData; + HANDLE hFind; + + hFind = FindFirstFile((LPCSTR)path.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) + { + if (addPath) + list.push_back(directoryName + "/" + FindFileData.cFileName); + else + list.push_back(FindFileData.cFileName); + } + } + while(FindNextFile(hFind, &FindFileData)); + FindClose(hFind); + } + + #else + DIR *dp; + struct dirent *dirp; + if((dp = opendir(path.c_str())) == NULL) + { + return list; + } + + while ((dirp = readdir(dp)) != NULL) + { + if (dirp->d_type == DT_DIR) + list.push_back(static_cast<string>(dirp->d_name)); + } + closedir(dp); + #endif + + return list; + } + + std::vector<std::string> Directory::GetListFilesR ( const string& directoryName, bool addPath ) + { + std::vector<std::string> list = Directory::GetListFiles(directoryName, addPath); + + std::vector<std::string> dirs = Directory::GetListFolders(directoryName, addPath); + + std::vector<std::string>::const_iterator it; + for (it = dirs.begin(); it != dirs.end(); ++it) + { + std::vector<std::string> cl = Directory::GetListFiles(*it, addPath); + list.insert(list.end(), cl.begin(), cl.end()); + } + + return list; + } + +} \ No newline at end of file