0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-05-17 09:23 次阅读

【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压缩库,使用时需要根据具体情况进行修改和适配。在具体实现时,还需要考虑图像大小、压缩比率、编码质量等因素,以便更好地满足实际需求。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6002

    文章

    43980

    浏览量

    620888
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348846
  • 摄像头
    +关注

    关注

    59

    文章

    4612

    浏览量

    92909
  • RGB
    RGB
    +关注

    关注

    4

    文章

    763

    浏览量

    57417
  • JPEG
    +关注

    关注

    0

    文章

    65

    浏览量

    29736
收藏 人收藏

    评论

    相关推荐

    请问怎么在单片机中把十进制转为十六进制的格式

    大家好,帮帮忙,在单片机中想把十进制X = 123456转为十六进制 X = 0x123456的格式,有什么方法吗,或者有代码例子吗?谢谢!
    发表于 09-29 10:20

    STM32F1单片机上实现FFT

    STM32F1系列单片机上面实现FFT最近需要做一台基于stm32的示波器,测量信号参数,用单片机上面一些传统的方法局限性还是比较大,故开始琢磨直接上fft。...
    发表于 08-05 07:41

    什么是测试单片机控制单色屏幕的最佳办法

    什么是测试单片机控制单色屏幕的最佳办法?将视频转为图像数据的matlab代码该如何去编写?
    发表于 09-24 09:13

    如何去实现stm32单片机上RGB565图像简单处理呢

    如何去实现stm32单片机上RGB565图像简单处理呢?有哪些步骤?
    发表于 11-19 08:07

    STM32 tjpgd软件JPEG解码后RGB888数据格式不对怎么解决

    STM32上面使用TJPGD解码后,发现RGB888的数据格式单片机或常规的RGB格式顺序有
    发表于 02-17 07:56

    请问有大佬知道怎么将FPGA通过TCP传输的RGB888图像数据通过labview显示为图像吗,感谢感谢

    新手小白,已经尝试过一些将JPEG图像格式数据转为图像的例子,用RGB888格式
    发表于 10-30 21:16

    JPEG图像数据格式简明分析

    本文针对最常见的JPEG 图像格式的压缩数据进行分析,描述了每一字节的数据所表示的含义,同时也介绍了JPEG 图像
    发表于 09-18 11:05 16次下载

    针对JPEG格式的数字隐写与隐写分析

    剖析了JPEG文件结构,提出了基于JPEG格式的隐写方案;并针对该方案提出了相应的隐写分析方案;然后通过大量统计,建立了两个数据库,并最终构建了一个准实时隐藏信息提取系统。
    发表于 02-17 11:18 20次下载
    针对<b class='flag-5'>JPEG</b><b class='flag-5'>格式</b>的数字隐写与隐写分析

    yuv422p格式数据流转换成RGB888格式数据

    yuv422p格式数据流转换成RGB888格式数据流,亲测可用
    发表于 02-25 18:12 14次下载

    是否要从单片机转为嵌入式Linux

    最近很多童鞋投票并咨询如何从单片机转为嵌入式Linux开发。看来读者圈中做单片机,RTOS的不少。尽管小编目前从事Linux/Android方面的嵌入式开发工作,但是读书的时候也有5年左右单片
    发表于 11-13 20:51 11次下载
    是否要从<b class='flag-5'>单片机</b><b class='flag-5'>转为</b>嵌入式Linux

    单片机串口发送数据格式_STM32实例——USART串口通信实验(一)

    Labview发送指令给STM32单片机,控制单片机上LED灯亮灭。通信的基本概念我们知道 STM32F1 芯片内含有非常多的通信接口,学习这些通信接口前,我们很有必要了解下通信的基.
    发表于 11-18 18:36 18次下载
    <b class='flag-5'>单片机</b>串口发送<b class='flag-5'>数据格式</b>_<b class='flag-5'>STM32</b>实例——USART串口通信实验(一)

    51单片机的printf等格式输出函数

    在51单片机上使用printf函数、sprintf函数要注意以下几点:无符号16位数格式符用%d或者%u,千万不能加字母“l”,否则会出错32位数据格式符必须加字母“l”,否则会出错8位数据格
    发表于 11-20 16:36 12次下载
    51<b class='flag-5'>单片机</b>的printf等<b class='flag-5'>格式</b>输出函数

    STM32 tjpgd软件JPEG解码后RGB888数据格式问题

    STM32上面使用TJPGD解码后,发现RGB888的数据格式单片机或常规的RGB格式顺序有
    发表于 12-20 19:37 13次下载
    <b class='flag-5'>STM32</b> tjpgd软件<b class='flag-5'>JPEG</b>解码后<b class='flag-5'>RGB</b>888<b class='flag-5'>数据格式</b>问题

    AN5246_SMPS在STM32WB系列单片机上的应用

    AN5246_SMPS在STM32WB系列单片机上的应用
    发表于 11-21 08:11 0次下载
    AN5246_SMPS在<b class='flag-5'>STM32</b>WB系列<b class='flag-5'>单片机上</b>的应用

    如何将FreeRTOS移植到STM32单片机上

    本文详细介绍如何移植FreeRTOS到STM32单片机上。移植操作系统是嵌入式开发的入门基础,单片机和嵌入式在物理上其实是一摸一样的,区别就是软件上嵌入式跑了操作系统而单片机没有。本文
    的头像 发表于 01-20 17:36 2132次阅读
    如何将FreeRTOS移植到<b class='flag-5'>STM32</b><b class='flag-5'>单片机上</b>