如何将 Opencv Mat 转换为 JPEG 字符数据
Posted
技术标签:
【中文标题】如何将 Opencv Mat 转换为 JPEG 字符数据【英文标题】:How to convert Opencv Mat to JPEG char data 【发布时间】:2019-07-06 10:56:37 【问题描述】:最近,我无法将 OpenCV 从我的网络摄像头捕获的 Mat 帧转换为普通的 JPEG 无符号字符数组。我在 Google 上尝试了一种或两种方法,但结果似乎不是正确的 jpeg uchar 数组。这是我的一段代码:
VideoCapture cap(0);
if(!cap.isOpened())
return -1;
Mat frame;
cap >> frame;
if( frame.empty())
return -1;
int size = frame.total() * frame.elemSize();
unsigned char* buffer = new unsigned char[size];
memcpy(buffer, frame.data, size * sizeof(unsigned char));
然后我使用 fwrite 将该缓冲区写入 file.jpg (看起来很傻,但如果缓冲区正确,它确实有效),但文件不能打开或确定为 jpeg 图像。
谁能帮我解决这个问题?
【问题讨论】:
您真正想要的净结果是什么?您想要磁盘上的 JPEG 文件吗? RAM 中的垫子? 【参考方案1】:查看 OpenCV 函数 imencode()
。它将使用编码为正确图像类型(基于文件类型参数)的数据填充缓冲区,以便可以将其写入文件并且其他程序将知道如何处理它。
您当前方法的问题是您尝试将 原始 图像数据写入 JPEG,但 JPEG 是一种压缩数据格式,因此程序不知道如何处理您的数据写过。这相当于获取一个二进制文件并将其保存为 JPEG,该文件将没有正确的标题作为图像解码,否则数据很可能与 JPEG 格式不匹配。
【讨论】:
!!!你完全正确!我刚刚测试了它,非常感谢您的帮助。天哪,我已经在它周围呆了几个小时了。 ops,很抱歉,通过 imencode() 压缩后的缓冲区不是我想要的,即 640*480*3,有没有办法让压缩的缓冲区填满所有640*480*3 的无符号字符数组? 这不是jpg
所做的。 jpg
是一种有损压缩,因此您的缓冲区大小几乎总是小于像素数据。我想你在想bmp
。
@QuangHoang 我的原始代码使用v4l2 linux 将图像取出,我不太确定它是如何工作的,但代码确实定义了相机的输出是 MJPEG 并将帧捕获为数组大小640*480*3。当我用 fwrite 写出来时,完全没问题:(
@hoango27 我认为您需要位图或 TIFF 或 PNG,或任何其他无损格式。 JPEG 是有损数据,句号。它不存储原始数据。以上是关于如何将 Opencv Mat 转换为 JPEG 字符数据的主要内容,如果未能解决你的问题,请参考以下文章
如何将 RGB32 格式的 QImage 转换为 OpenCV::mat?