26

我有一个unsigned char*包含 jpeg 图像数据的缓冲区。我想使用 c++ 和 opencv 显示该图像。如果我做:

Mat img(Size(640, 480), CV_8UC3, data);
namedWindow("image", 1);
imShow("image", img);

我得到一堆嘈杂的像素。

我想这是因为数据是 jpeg(带有标题)。因为这有效:

Mat imgbuf(Size(640, 480), CV_8UC3, data);
Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);

但是我不能使用 imdecode 函数,因为它来自基于 GTK 2 的 highgui.h,在我的项目中我使用 GTK 3。

那么,如何显示缓冲区数据呢?有没有办法在opencv中解码jpeg图像而不是imdecode,如果这是问题的话。我真的不想用Qt重建opencv ...

还有其他建议吗?

(使用 Linux)

4

2 回答 2

54

我在网上看到很多对这个问题的回答说你应该直接调用 libjpeg 并绕过 OpenCV 的 imread() 例程。

这不是必需的!您可以使用 imdecode() 从内存中解码原始图像缓冲区。这样做的方法不直观,并且没有足够的文档来帮助人们第一次尝试这样做。

如果您有原始文件数据的指针/大小(fread() 直接来自 .jpg、.png、.tif、文件等...

int    nSize = ...       // Size of buffer
uchar* pcBuffer = ...    // Raw buffer data


// Create a Size(1, nSize) Mat object of 8-bit, single-byte elements
Mat rawData( 1, nSize, CV_8UC1, (void*)pcBuffer );

Mat decodedImage  =  imdecode( rawData /*, flags */ );
if ( decodedImage.data == NULL )   
{
    // Error reading raw image data
}

就是这样!

希望这对将来的某人有所帮助。

于 2015-07-11T20:51:48.663 回答
4

我已经使用libjpeg API 文档libjpeg中“解压缩详细信息”下描述的标准过程解压缩了 JPEG 图像。

解压缩数据后,您可以使用它来构建cv::Mat. 请注意,解压后的图像是 RGB 格式,而 openCV 使用 BGR 格式,因此需要cvtColor()使用格式进行操作CV_RGB2BGR

于 2013-02-26T15:21:34.283 回答