对多个扩展使用cv::glob

Using cv::glob for multiple extensions

本文关键字:cv glob 扩展      更新时间:2023-10-16

我试图使用cv::glob在文件夹系统中查找图像。我现在想要一次搜索多个文件扩展名(假设是.jpg和.png)。有办法做到这一点吗?

关于该方法的opencv文档没有指定pattern参数。

目前,我正在使用难看且低效的方法,分别搜索每个扩展并组合结果。看到:

vector<cv::String> imageNames;
vector<string> allowedExtensions = { ".jpg", ".png" };
for (int i = 0; i < allowedExtensions.size(); i++) {
    vector<cv::String> imageNamesCurrentExtension;
    cv::glob(
        inputFolder + "*" + allowedExtensions[i],
        imageNamesCurrentExtension,
        true
    );
    imageNames.insert(
        imageNames.end(),
        imageNamesCurrentExtension.begin(),
        imageNamesCurrentExtension.end()
    );
}

Open CV甚至OS文件系统API都没有内置的方法来做到这一点。您可以通过消除对文件夹/文件夹的多次迭代来改进代码。例如,您可以使用boost::filesystem::recursive_directory_iterator和一些过滤器函数在一次迭代中检索所有文件。

示例如下:

#include <boost/filesystem.hpp>
#include <set>
namespace fs = ::boost::filesystem;
void GetPictures(const fs::path& root, const std::set<string>& exts, vector<fs::path>& result)
{
  if(!fs::exists(root) || !fs::is_directory(root)) 
  {
    return;
  }
  fs::recursive_directory_iterator it(root);
  fs::recursive_directory_iterator endit;
  while(it != endit)
  {
    if(fs::is_regular_file(*it) && exts.find(it->path().extension()) != exts.end()) 
    {
      result.push_back(it->path());
    }
    ++it;
  }
}

这只是一个示例,您应该注意字符串的大小写,错误处理等