opencv从缓冲区读取jpeg图像
c++
image
image-processing
opencv
6
0

我有一个包含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)

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

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

解压缩数据后,您可以使用它来构造cv::Mat 。你要知道,解压缩的图像是RGB格式,而OpenCV的使用BGR格式,所以cvtColor()与格式化操作CV_RGB2BGR是必要的。

收藏
评论

我已经在网上看到很多对此问题的回答,说您应该直接调用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
}

而已!

希望这对以后的人有所帮助。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号