用C++将字节arry转换为OpenCV图像

Convert a byte arry to OpenCV image in C++

本文关键字:OpenCV 图像 转换 arry C++ 字节      更新时间:2023-10-16

我有一个字节数组,它表示一个.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;

如果是PIXEL数据,前面提到的方法会很好地工作。

如果在内存、头文件、压缩等等中都有一个完整的jpg文件,那么它就不起作用了。

在这种情况下,你想要:

Mat img = imdecode(data);

它将执行与imread()相同的操作,仅来自内存,而不是来自文件名

@bob提到,这可以使用Mat构造函数来完成。

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

创建此矩阵后,使用图像中的行数调用整形函数。

cv::Mat reshapedImage = imageWithData.reshape(0, numberOfRows);
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定义的

使用cv::Mat1b的效率要高得多,并且不会复制比所需多2倍的内存

cv::Mat GetImageFromMemory(uchar* image, int length, int flag)
{
   cv::Mat1b data(1, length, image));
    return  imdecode(data, flag);
}