Конвертировать opencv :: Mat в std :: string дает std :: bad_alloc - PullRequest
1 голос
/ 21 октября 2019

У меня есть cv::Mat размера 2064x1544, и я хочу сохранить его как std::string.
Мой код прост:

std::string image_string(image.begin<unsigned char>(), image.end<unsigned char>());
json["image"] = image_string;

Как я писал в заголовкеНа вопрос я попал в эту ошибку:

std::bad_alloc

В чем проблема?

1 Ответ

1 голос
/ 21 октября 2019

Я бы рекомендовал использовать cv::imencode функцию OpenCV вместо вашей попытки, поскольку она более гибкая и безопасная.

Вы можете использовать эту функцию для преобразования cv::Mat в std::string. Обратите внимание, что вам нужно указать формат изображения. Возможно, вы захотите изменить «.png» на «.jpg» или что-либо, поддерживаемое cv::imencode(...).

std::string get_mat_as_string(const cv::Mat& cv_buffer_orig) {
    std::stringstream ss;
    if (!cv_buffer_orig.empty()) {
        try {
            std::vector<uint8_t> buffer;
            cv::imencode(".png", cv_buffer_orig, buffer);
            for (auto c : buffer) ss << c;
        } catch (std::exception& e) { std::cerr << e.what() << std::endl; }
    }
    return ss.str();
}

Для извлечения закодированного cv :: Mat внутри std :: string, которую вы будете использовать

   std::string buffer; // must contain encoded image from above function
   std::vector<byte> pic_data(buffer.begin(), buffer.end());
   cv::Mat mat(pic_data, true);
   mat = cv::imdecode(mat, cv::IMREAD_COLOR);

Теперь mat содержит оригинальный cv :: Mat.


Я изначально написал (слегка отредактированный) для передачи cv::Mat s по сети, вы можете использоватьэто на ваше усмотрение.

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