opencv4 使用Directory,需要包含contrib.hpp

【opencv4 使用Directory,需要包含contrib.hpp】直接包含进工程文件 不用下载安装编译了easy
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kekong0713/article/details/52798259
1.新版本的opencv3.X系列在提升稳定性的同时也砍掉了一些常用的函数库,例如opencv2\contrib\contrib.hpp,这个库在opencv2.X版本中就有,到opencv3.x版本之后发现被砍掉了,还好opencv是开源的,可以直接将需要的源码部分包含到工程文件中编译就行了,一般兼容性还是不错的。
例如:在contrib.hpp中包含了一种可以直接获取当前文件夹下文件的类
class CV_EXPORTS Directory
{
public:
static std::vector GetListFiles( const std::string& path, const std::string & exten = "*", bool addPath = true );
static std::vector GetListFilesR ( const std::string& path, const std::string & exten = "*", bool addPath = true );
static std::vector GetListFolders( const std::string& path, const std::string & exten = "*", bool addPath = true );
};
这个类读取文件还是很方便的,不然直接用C++来获取,还是有点麻烦,不然就只能用先进行批处理将文件信息保存在文本文件中,然后读取文本文件的方法了。但这个类在opencv3.x版本中并未发现。可以在opencv2.x找到源码.在工程中建立contrib.hpp文件和contrib.cpp文件,在主程序中直接引用就好了。
contrib.hpp文件:
#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 GetListFiles( const std::string& path, const std::string & exten = "*", bool addPath = true );
static std::vector GetListFilesR ( const std::string& path, const std::string & exten = "*", bool addPath = true );
static std::vector GetListFolders( const std::string& path, const std::string & exten = "*", bool addPath = true );
};
#endif
contrib.cpp文件:
#include "contrib.hpp"
//#include
#if defined(WIN32) || defined(_WIN32)
#include
#include
#else
#include
#endif
std::vector Directory::GetListFiles( const std::string& path, const std::string & exten, bool addPath )
{
std::vector 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(dirp->d_name));
else
if (std::string(dirp->d_name).find(exten) != std::string::npos)
list.push_back(static_cast(dirp->d_name));
}
}
closedir(dp);
#endif
return list;
}
std::vector Directory::GetListFolders( const std::string& path, const std::string & exten, bool addPath )
{
std::vector 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(dirp->d_name));
else
if (std::string(dirp->d_name).find(exten) != std::string::npos)
list.push_back(static_cast(dirp->d_name));
}
}
closedir(dp);
#endif
return list;
}
std::vector Directory::GetListFilesR ( const std::string& path, const std::string & exten, bool addPath )
{
std::vector list = Directory::GetListFiles(path, exten, addPath);
std::vector dirs = Directory::GetListFolders(path, exten, addPath);
std::vector::const_iterator it;
for (it = dirs.begin(); it != dirs.end(); ++it)
{
std::vector cl = Directory::GetListFiles(*it, exten, addPath);
list.insert(list.end(), cl.begin(), cl.end());
}
return list;
}
————————————————
版权声明:本文为CSDN博主「think0713」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kekong0713/article/details/52798259

    推荐阅读