如何将 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 字符数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C++ 数组转换为 opencv Mat

如何将 RGB32 格式的 QImage 转换为 OpenCV::mat?

如何将 Mat 数据(OpenCV,图像数据格式)转换为统一的 3d 纹理

将vector<Mat>转换为矢量文件Opencv

如何将opencv mat转换为字符串c ++

opencv 图像类型(Mat图像字节流BitmapBITMAPINFOCxImage)之间的转换