Как последовательно читать файлы из каталога в OpenCV и использовать его для обработки? - PullRequest
0 голосов
/ 07 мая 2018

Когда я пытаюсь скомпилировать этот фрагмент кода, я получаю эту ошибку-

ошибка: нет соответствующей функции для вызова '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 голосов
/ 07 мая 2018

Функция cv::glob имеет следующую подпись:

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

Поскольку pattern передается по значению, а cv::String может быть , составленным из std::string, первый параметр не является проблемой. Временный cv::String создается автоматически.

Тем не менее, второй - result - есть, поскольку он принят как неконстантная ссылка. Чтобы решить вашу проблему, вам нужно сделать filename a 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, строка)
  • Отсутствуют квалификаторы пространства имен (std:: или cv:: - избегать using namespace на верхнем уровне )
  • Нет main()
  • Код вне функции
  • Куча другого несвязанного кода после соответствующего бита, который я не буду анализировать далее (но примерно 80% вашего примера кода не имеет значения).
0 голосов
/ 07 мая 2018

Попробуйте использовать 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);

Некоторая информация здесь (функция glob), здесь (класс String в OpenCV), здесь (пример использования glob с cv :: String) и здесь (предложение Берака).

РЕДАКТИРОВАТЬ: я забыл упомянуть, что вам нужно также переключить filename с std::string на cv::String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...