我有一个包含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)
答案 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}}操作。