写点什么

STM32 单片机上 RGB 数据转为 JPEG 格式办法

作者:DS小龙哥
  • 2023-06-14
    重庆
  • 本文字数:1366 字

    阅读完需:约 4 分钟

【1】项目背景

在 STM32 单片机上调用 OV 系列摄像头读取实时视频,然后对数据进行分析,分析之后再通过 WIFI 或者 4G 网络传输给服务器保存和显示。因为处理数据时,采用的是 RGB 源数据格式,处理之后的数据需要通过网络传输,由于 RGB 源数据占用内存很大,对接下来的网络传输非常不力,严重影响传输速度。所以,需要先将 RGB 数据压缩成 JPG 格式再进行传输。


【2】常用的 JPGE 压缩库

(1)libjpeg 库

libjpeg 是一个用于处理 JPEG 图像格式的库。它提供了一组用于压缩和解压缩 JPEG 图像的函数,可以在各种操作系统上使用。libjpeg 是由 Independent JPEG Group 开发的自由软件,其主要功能包括压缩和解压缩 JPEG 图像、转换 JPEG 图像格式以及进行基本颜色空间转换等。许多图像处理应用程序都使用 libjpeg 库来实现 JPEG 图像的读取、写入和处理等功能。

(2)TinyJPEG 库

TinyJPEG 是一个用于处理 JPEG 图像格式的小型库。它是在 libjpeg 库的基础上进行了简化和优化,以实现更高效的 JPEG 压缩和解压缩。TinyJPEG 库的主要特点是代码量小、易于集成和使用,并且可以在嵌入式设备等资源受限的环境中运行。由于其小巧、快速和可移植性等特点,TinyJPEG 库通常用于低功耗设备、嵌入式系统、移动应用程序等领域,以提供高质量的图像处理能力。

【3】示例代码

TinyJPEG 库是一款轻量级的 JPEG 压缩库,适用于资源受限的嵌入式系统。下面采用 STM32F103ZET6 作为实验对象,STM32F103ZET6 是一款基于 ARM Cortex-M3 内核的微控制器,具有高性能和低功耗的特点。


将 RGB565 格式的图像压缩成 JPEG 格式,需要经过以下几个步骤:


  1. 将 RGB565 数据转换为 YUV420 格式数据。由于 JPEG 压缩算法基于 YUV 颜色空间,因此需要先将 RGB565 数据转换为 YUV420 格式数据,以便后续处理。

  2. 对 YUV420 数据进行预处理。在进行 JPEG 压缩前,需要对 YUV420 数据进行预处理,包括分块、离散余弦变换(DCT)、量化等操作。

  3. 进行霍夫曼编码。将预处理后的数据进行霍夫曼编码,以便能够更好地压缩数据。

  4. 生成 JPEG 文件。将编码后的数据写入到 JPEG 文件中,即可生成 JPEG 格式的图像数据。


以下是一个示例代码,使用 TinyJPEG 库将 RGB565 格式的图像压缩成 JPEG 格式:


#include "tiny_jpeg.h"
#define WIDTH 320#define HEIGHT 240#define RGB_BUF_SIZE (WIDTH * HEIGHT * 2)#define JPEG_BUF_SIZE (WIDTH * HEIGHT)
uint8_t rgb_buf[RGB_BUF_SIZE];uint8_t jpeg_buf[JPEG_BUF_SIZE];
int main(void){ // 初始化摄像头和LCD等设备
// 获取RGB565格式的图像数据 get_rgb_data(rgb_buf, RGB_BUF_SIZE);
// 将RGB565格式的图像数据转换为YUV420格式数据 uint8_t yuv_buf[WIDTH * HEIGHT * 3 / 2]; rgb_to_yuv(rgb_buf, WIDTH, HEIGHT, yuv_buf);
// 对YUV420格式数据进行预处理 uint8_t dct_buf[JPEG_BUF_SIZE]; preprocess(yuv_buf, WIDTH, HEIGHT, dct_buf);
// 进行霍夫曼编码 int jpeg_size = encode(dct_buf, WIDTH, HEIGHT, jpeg_buf, JPEG_BUF_SIZE);
// 将压缩后的JPEG数据写入到SD卡或其他存储介质中 write_jpeg_to_sd_card(jpeg_buf, jpeg_size);
while (1) { // 主循环,处理其他任务 }}
复制代码


TinyJPEG 库是一款通用的 JPEG 压缩库,使用时需要根据具体情况进行修改和适配。在具体实现时,还需要考虑图像大小、压缩比率、编码质量等因素,以便更好地满足实际需求。

发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022-01-06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
STM32单片机上RGB数据转为JPEG格式办法_6 月优质更文活动_DS小龙哥_InfoQ写作社区