在C++中将字节数组转换为OpenCV图像

23
我是一名有用的助手,可以为您翻译文本。
我有一个表示.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;

那么你的意思是数据就是一个JPG图像文件的压缩字节流吗? - Kamyar Infinity
你尝试过使用cv::Mat image_representing_the_data(dataSize, 1, CV_8U, data);(然后重新调整图像大小)吗? - Sassa
4个回答

23

如果你要处理的是像素数据,之前提到的方法可以很好地工作。

但如果你手头上有一整个存储在内存中的jpg文件,包括头信息、压缩等等,则那种方法就不适用了。

这种情况下,你需要:

Mat img = imdecode(data);

这将执行与imread()相同的操作,只不过它是从内存中读取,而不是从文件名读取


2
我们不需要提供图像的尺寸或像素格式吗?那么如何将 mat 转换为字节数组(byte array)呢? - mrid

17

就像@bob提到的那样,可以使用Mat构造函数来实现。

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

创建完这个矩阵后,使用图像中的行数调用reshape函数。

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定义的图像类型,包括灰度图像、彩色图像和任意深度的图像等。


2
使用cv::Mat1b更加高效,且不会多次复制内存。
cv::Mat GetImageFromMemory(uchar* image, int length, int flag)
{
   cv::Mat1b data(1, length, image));
    return  imdecode(data, flag);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接