21

我有一个字节数组,它代表我想直接转换为 OpenCV Mat 对象的 .jpg 文件。

我有类似的东西

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;
4

4 回答 4

21

如果是 PIXEL 数据,前面提到的方法可以正常工作。

相反,如果您在内存、标题、压缩等所有内容中有一个完整的 jpg 文件,则它将无法正常工作。

在这种情况下,您想要:

Mat img = imdecode(data);

这将与 相同imread(),仅来自内存,而不是来自文件名

于 2013-03-27T12:59:28.760 回答
15

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

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

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

cv::Mat reshapedImage = imageWithData.reshape(0, numberOfRows);
于 2012-08-26T04:56:37.417 回答
2
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

于 2018-11-27T20:52:27.630 回答
0

使用 cv::Mat1b 效率更高,并且不会将内存复制到所需的 2 倍以上

cv::Mat GetImageFromMemory(uchar* image, int length, int flag)
{
   cv::Mat1b data(1, length, image));
    return  imdecode(data, flag);
}
于 2021-11-23T08:33:00.187 回答