如何从OpenCV中的目录顺序读取文件并将其用于处理?

时间:2018-05-07 09:19:21

标签: c++ opencv opencv3.0 glob

当我尝试编译这段代码时,我收到了这个错误 -

  

错误:没有匹配函数来调用' glob(std :: __ cxx11 :: string&,std :: vector>&,bool)'            glob(文件夹,文件名,false);                                         ^

这是我使用的代码:

    #include <vector>
    #include <glob.h>

    string folder = "/home/ragesh/C++ /calibration_laptop/images/*.jpg";
    vector <string> filename;
    glob(folder, filename, false);
    if(count < filename.size())
    {

        img = imread(filename[count]);
        if(img.empty())
        {
            cout << "\nimage loading failed.....!"<<"\n";
            return 0;
        }
        imshow("image", img);
        cvtColor ( img,gray, COLOR_BGR2GRAY );// gray scale the source image
        vector<Point2f> corners; //this will be filled by the detected corners

        bool patternfound = findChessboardCorners(gray, boardSize, corners, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);
        count ++;
    }

2 个答案:

答案 0 :(得分:2)

函数cv::glob具有以下签名:

void cv::glob(cv::String pattern, std::vector<cv::String>& result, bool recursive = false)  

由于pattern是按值传递的,而cv::String可以是constructed from a std::string,因此第一个参数不是问题。

自动构建临时cv::String

然而,第二个 - result - 是,因为它被视为非const引用。要解决您的问题,您需要filename一个std::vector<cv::String>。由于它代表了文件名的集合,我还建议使用复数来命名它:filenames

示例代码:

#include <opencv2/opencv.hpp>

#include <string>
#include <vector>

int main()
{
    std::string folder("/home/ragesh/C++ /calibration_laptop/images/*.jpg");
    std::vector<cv::String> filenames;
    cv::glob(folder, filenames, false);

    // Do something with filenames...

    return 0;
}

<强>更新

我从签名和你问题上的标签得出结论,你是在OpenCV之后glob(不完整的代码示例使得这有点困难)。但请注意,您添加的标题是Posix glob函数。

很有可能是造成问题的另一个原因。

为了完整起见,让我列出我在代码示例中找到的其他问题:

  • 缺少包括(opencv,string)
  • 缺少名称空间限定符(std::cv:: - avoid using namespace at top level
  • main()
  • 功能外的代码
  • 相关位之后的一堆其他无关代码,我不会进一步分析(但大约80%的代码示例都无关紧要)。

答案 1 :(得分:1)

尝试使用CV::String代替std::string

添加#include "cvstd.hpp",然后

cv::String new_folder_string(folder).
std::vector<cv::String> new_filename_vector.
glob(new_folder_string, new_filename_vector, false);

一些信息here(glob函数),here(OpenCV中的String类),here(使用带cv :: String的glob的示例)和here (berak的建议)。

编辑:我忘了提及您还需要将filenamestd::string切换为cv::String