Mat*_*ekk 21 c++ jpeg opencv image image-processing
我有一个unsigned char*
包含jpeg图像数据的缓冲区.我想使用c ++和opencv显示该图像.如果我做:
Mat img(Size(640, 480), CV_8UC3, data);
namedWindow("image", 1);
imShow("image", img);
Run Code Online (Sandbox Code Playgroud)
我得到了一堆嘈杂的像素.
我想这是因为数据是jpeg(带有标题).因为这有效:
Mat imgbuf(Size(640, 480), CV_8UC3, data);
Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
Run Code Online (Sandbox Code Playgroud)
但我不能使用imdecode函数,因为它来自highgui.h,它基于GTK 2,在我的项目中我使用GTK 3.
那么,我该如何显示缓冲区数据呢?有没有办法在opencv中解码除imdecode之外的jpeg图像,如果这是问题.我真的不想用Qt重建opencv ...
还有其他建议吗?
(使用Linux)
小智 41
我在网上看到很多关于这个问题的回答说你应该直接调用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
}
Run Code Online (Sandbox Code Playgroud)
而已!
希望这可以帮助将来的某个人.
我已使用libjpeg API 文档libjpeg
“解压缩详细信息”下描述的标准过程解压缩了 JPEG 图像。
解压缩数据后,您可以使用它来构建cv::Mat
. 请注意,解压后的图像是 RGB 格式,而 openCV 使用 BGR 格式,因此需要cvtColor()
进行格式操作。CV_RGB2BGR