首页 > 解决方案 > 如何从OpenCV中的目录中依次读取文件并用于处理?

问题描述

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

错误:没有匹配函数调用 'glob(std::__cxx11::string&, std::vector >&, bool)' glob (folder, filename, 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 ++;
    }

标签: c++opencvopencv3.0glob

解决方案


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

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

由于pattern是按值传递,并且 acv::String可以从 a 构造std::string,所以第一个参数不是问题。临时cv::String自动构建。

但是,第二个 -- result-- 是,因为它被视为非常量引用。为了解决您的问题,您需要制作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(不完整的代码示例使这有些困难)。但是,请注意您包含的标题是针对Posixglob函数的。

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

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

  • 缺少包括(opencv,字符串)
  • 缺少命名空间限定符(std::cv::--避免using namespace在顶层
  • main()
  • 函数外的代码
  • 相关位之后还有一堆其他不相关的代码,我不会进一步分析(但大约 80% 的代码示例是不相关的)。

推荐阅读