Перегрузка std :: istream с помощью cv :: Mat - PullRequest
0 голосов
/ 12 марта 2020

Я напечатал объект cv::Mat в файл, используя std::ofstream, просто написав ofs << mat;. Когда я пытаюсь сделать то же самое с std::ifstream, я получаю следующую ошибку:

binary '>>': не найден оператор, который принимает левый операнд типа 'std :: ifstream '(или нет приемлемого преобразования)

Я знаю, что операторы перегрузки возможны и полезны во многих случаях, например печать std::vector.

Как можно ли перегрузить operator >> таким образом, чтобы он считывал cv::Mat из объекта std::ifstream, например ifs >> mat?

Пример результата из std::cout << mat:

[253, 104;
 287, 222;
 282, 225;
 283, 225]

1 Ответ

0 голосов
/ 12 марта 2020
// read data to cv::Mat of type CV_64F
std::istream& operator >> (std::istream& is, cv::Mat& mat)
{
    char ch = 0;
    while (is.good() && ch != '[') {
        is >> ch;
    }
    //assert(ch == '[');
    std::vector<double> m(0);
    size_t cols = 0;
    bool end_of_file = false;
    while ( is.good() && ! end_of_file )
    {
        bool end_of_line = false;
        std::vector<double> v(0);
        while ( is.good() && ! end_of_line )
        {
            double d;
            is >> d;
            v.push_back(d);
            char c;
            is >> c;
            switch (c)
            {
            case ']':
                end_of_file = true;
            case ';':
                end_of_line = true;
                break;
            case ',':
                break;
            default:
                //std::cerr << "Unexpected character read: " << c << std::endl;
                //assert(c == ',');
            }
        }
        if (m.size() == 0) {
            cols = v.size();
        }
        else {
            //assert(v.size() == cols);
        }
        m.insert(m.end(), v.begin(), v.end());
    }
    cv::Mat res(cv::Size(cols, m.size() / cols), CV_64F, m.data());
    mat = res.clone();
    return is;
}

Обратите внимание, что он основан на предположениях о входных данных. Утверждения закомментированы для исключительной безопасности.

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