opencv从缓冲区读取jpeg图像

时间:2013-02-06 10:53:59

标签: c++ image image-processing opencv jpeg

我有一个包含jpeg图像数据的unsigned char*缓冲区。我想使用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中解码除imdecode之外的jpeg图像,如果这是问题。我真的不想用Qt重建opencv ......

还有其他建议吗?

(使用Linux)

2 个答案:

答案 0 :(得分:35)

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

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

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

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
}

那是IT!

希望这有助于将来。

答案 1 :(得分:4)

我使用libjpeg使用“减压详细信息”下的libjpeg API documentation中描述的标准程序对JPEG图像进行了解压缩。

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

相关问题