【发布时间】:2013-01-21 13:04:30
【问题描述】:
我有一个包含 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中解码jpeg图像而不是imdecode,如果这是问题的话。我真的不想用 Qt 重建 opencv...
还有其他建议吗?
(使用 Linux)
【问题讨论】:
-
您不能使用
libjpeg进行解码并完成它吗?这有什么问题? -
@mmgp 我会尝试 libjpeg,只是想我可以在不包含另一个库的情况下做同样的事情。
-
如果没有
libjpeg,opencv 不会加载 jpeg 图像,因此没有包含其他库。 -
哇,你的所作所为真的不行。在您的
Mat imgbuf(...)行中,您读取 640x480x3 字段中的数据。由于 jpeg 是压缩的,因此 jpeg 确实可以轻松放入其中。所以其余的点然后用内存中的随机数据填充,这非常非常糟糕。之后,您加载 Mat,其中包括 JPEG 和一堆随机内存数据,并对其进行解码。相反,首先将您的 unsigned char 缓冲区放入与缓冲区大小完全相同的向量或 mat 中,然后将其输入 imdecode。
标签: c++ image image-processing opencv jpeg