Проблема с инициализацией вашей матрицы ... В частности, здесь:
mat = new cv::Mat(rows,cols,type,(void *)decoded_data.data());
Вот этот конструктор
Mat (int, int, cols, int, void * data, size_t step = AUTO_STEP)
, который в документации говорит следующее о * параметре данных
data Указатель на данные пользователя. Матричные конструкторы, которые принимают данные и
параметры шага не выделяют матричные данные. Вместо этого они просто
инициализировать заголовок матрицы, который указывает на указанные данные, которые
означает, что данные не копируются. Эта операция очень эффективна и может
использоваться для обработки внешних данных с использованием функций OpenCV. Внешний
данные не освобождаются автоматически, поэтому вам следует позаботиться об этом.
Это означает, что, как только она выйдет из области видимости (функция выходит), созданная вами строка (decoded_data) выйдет и данные будут освобождены строкой, а затем ваш cv :: Mat будет иметь ссылку на данные, которые больше не действительны ...
Вы всегда можете инициализировать матрицу чем-то вроде
cv::Mat(rows,cols,type)
, а затем используйте что-то вроде std :: memcpy или подобное для копирования данных в mat.data
член. На самом деле, AFAIK не нужно передавать байт в строку, а затем в мат, который приводится в void, а затем в uchar ....
попробуйте что-то вроде:
mat = cv::Mat(rows,cols,type);
std::memcpy(&decodedBytes[0], mat.data, decodedBytes.size());
Просто небольшое предупреждение для этого решения, вам нужно проверить, что decodedBytes
не пусто и что mat.data
имеет достаточно места для получения всего содержимого decodedBytes
. Для этого просто убедитесь, что:
// size in bytes to copy == size of the allocated data of mat in bytes
decodedBytes.size() == (mat.elemSize() * mat.rows * mat.cols)
Еще пара замечаний, которые могут и не быть проблемой сейчас, но могут укусить вас позже:
- Не используйте указатели cv :: Mat ... Поведение cv :: Mat уже похоже на умный указатель.
- Остерегайтесь приведения / копирования данных из знака в unsign и наоборот. Я думаю, что теперь это сделано правильно, но это может стать проблемой позже.