2016-09-14 219 views
0

我試圖使用cv::glob在文件夾系統中查找圖像。我現在想要的是一次搜索多個文件擴展名(比如說.jpg和.png)。有沒有辦法做到這一點?對於多個擴展使用cv :: glob

此方法的opencv documentation未指定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() 
    ); 
} 

回答

0

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

這只是一個樣本,你應該照顧串外殼,錯誤處理等