Преобразование байта в образ OpenCV в С++

У меня есть массив байтов, который представляет файл .jpg, который я хочу преобразовать непосредственно в объект OpenCV Mat.

У меня есть что-то вроде

byte* data; // Represents a JPG that I don't want to disk and then read.
// What goes here to end up with the following line?
cv::Mat* image_representing_the_data;

Ответы

Ответ 1

ранее упомянутый метод будет работать нормально, если это данные PIXEL.

если вместо этого у вас есть целый файл jpg в памяти, заголовках, сжатии и т.д., это не сработает.

в этом случае вы хотите:

Mat img = imdecode(data);

который будет делать то же самое, что и imread(), только из памяти, а не из имени файла

Ответ 2

как упоминает @bob, это можно сделать с помощью конструктора Mat.

byte *data;
cv::Mat imageWithData = cv::Mat(sizeOfData, 1, CV_8U, data).clone();

После того, как вы создали эту матрицу, вызовите функцию изменения формы с количеством строк в изображении.

cv::Mat reshapedImage = imageWithData.reshape(0, numberOfRows);

Ответ 3

cv::Mat GetImageFromMemory(uchar* image, int length, int flag)
    {
        std::vector<uchar> data = std::vector<uchar>(image, image + length);
        cv::Mat ImMat = imdecode(data, flag);

        return ImMat;
    }

параметр "flag" относится к типу изображения, градациям серого, цвету, любому значению, для которого определено opencv