Я бы рекомендовал использовать 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 по сети, вы можете использоватьэто на ваше усмотрение.