使用 OpenCV 将 YUV 转换为有损压缩

Posted

技术标签:

【中文标题】使用 OpenCV 将 YUV 转换为有损压缩【英文标题】:Convert YUV to lossy compression with OpenCV 【发布时间】:2010-11-18 14:48:32 【问题描述】:

如何将 YUV 颜色空间中的图像转换为 JPEG 图像?

我有一个原始图像数据保存在一个 char* 变量中:

char* frame = (char*)camera->getFrame(); // YUV colorspace image data

我需要将其转换为 JPEG 图像数据。我不想将它保存到磁盘,因为我会以流的形式发送它。

【问题讨论】:

【参考方案1】:

OpenCV 本身不导出此功能。最干净的是使用libjpeg 进行编码。查看这些问题的答案:

Convert IplImage into a JPEG without using CvSaveImage in OpenCV OpenCV to use in memory buffers or file pointers

【讨论】:

嗯,这不好。我需要先压缩图像,然后再将它们流式传输到具有封闭嵌入式 linux 的系统上。它只有 OpenCV,我无法安装任何其他库。是否有其他方法可以在流式传输图像之前压缩图像以使其尺寸更轻?我需要保存 badwidth。使用 gzip 是个好主意吗? 在我的第二个链接的接受答案中,您会发现 OpenCV 内部具有无需写入文件即可编码为 JPEG 的功能。只是在较新版本的 OpenCV 中,它们可能会更改,恕不另行通知,因为它们不是 API 的一部分。如果您被困在具有特定库设置的封闭系统上,那么您可能无论如何都不会关心它。此外,zip 算法总是有用的,但你不应该期望它减少超过 50%..【参考方案2】:

检查文件 cvcolor.cpp 的 opencv src。这包含了所有的颜色转换。

我建议你修改这行附近的现有例程:

/* BGR/RGB -> YCrCb */

它们几乎正是 YUV 编码所需要的。如果是 4:4:4 而不是 4:2:2 或 4:1:1

用于 jpg 压缩

jpg 编码器和解码器位于 grfmt_jpeg.cpp 中,而 #include "jpeglib.h"

你可以直接调用这些

【讨论】:

以上是关于使用 OpenCV 将 YUV 转换为有损压缩的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV for Android:使用 Imgproc.cvtColor 将相机预览从 YUV 转换为 RGB

使用OpenCV从YUV颜色空间转换为RGB

OpenCV视频篇——YCrCb与YUV

OpenCV和FFMpeg图片转换对比

在 OpenCV 中将 YUV 转换为 BGR 或 RGB

为啥H264编码要先把数据转换成YUV图像格式的