0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

STM32單片機上RGB數(shù)據(jù)轉為JPEG格式辦法

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-05-17 09:23 ? 次閱讀

【1】項目背景

STM32單片機上調(diào)用OV系列攝像頭讀取實時視頻,然后對數(shù)據(jù)進行分析,分析之后再通過WIFI或者4G網(wǎng)絡傳輸給服務器保存和顯示。因為處理數(shù)據(jù)時,采用的是RGB源數(shù)據(jù)格式,處理之后的 數(shù)據(jù)需要通過網(wǎng)絡傳輸,由于RGB源數(shù)據(jù)占用內(nèi)存很大,對接下來的網(wǎng)絡傳輸非常不力,嚴重影響傳輸速度。所以,需要先將RGB數(shù)據(jù)壓縮成JPG格式再進行傳輸。

【2】常用的JPGE壓縮庫

(1)libjpeg庫

libjpeg是一個用于處理JPEG圖像格式的庫。它提供了一組用于壓縮和解壓縮JPEG圖像的函數(shù),可以在各種操作系統(tǒng)上使用。libjpeg是由Independent JPEG Group開發(fā)的自由軟件,其主要功能包括壓縮和解壓縮JPEG圖像、轉換JPEG圖像格式以及進行基本顏色空間轉換等。許多圖像處理應用程序都使用libjpeg庫來實現(xiàn)JPEG圖像的讀取、寫入和處理等功能。

(2)TinyJPEG庫

TinyJPEG是一個用于處理JPEG圖像格式的小型庫。它是在libjpeg庫的基礎上進行了簡化和優(yōu)化,以實現(xiàn)更高效的JPEG壓縮和解壓縮。TinyJPEG庫的主要特點是代碼量小、易于集成和使用,并且可以在嵌入式設備等資源受限的環(huán)境中運行。由于其小巧、快速和可移植性等特點,TinyJPEG庫通常用于低功耗設備、嵌入式系統(tǒng)、移動應用程序等領域,以提供高質(zhì)量的圖像處理能力。

【3】示例代碼

TinyJPEG庫是一款輕量級的JPEG壓縮庫,適用于資源受限的嵌入式系統(tǒng)。下面采用STM32F103ZET6作為實驗對象,STM32F103ZET6 是一款基于ARM Cortex-M3內(nèi)核的微控制器,具有高性能和低功耗的特點。

將RGB565格式的圖像壓縮成JPEG格式,需要經(jīng)過以下幾個步驟:

  1. 將RGB565數(shù)據(jù)轉換為YUV420格式數(shù)據(jù)。由于JPEG壓縮算法基于YUV顏色空間,因此需要先將RGB565數(shù)據(jù)轉換為YUV420格式數(shù)據(jù),以便后續(xù)處理。
  2. 對YUV420數(shù)據(jù)進行預處理。在進行JPEG壓縮前,需要對YUV420數(shù)據(jù)進行預處理,包括分塊、離散余弦變換(DCT)、量化等操作。
  3. 進行霍夫曼編碼。將預處理后的數(shù)據(jù)進行霍夫曼編碼,以便能夠更好地壓縮數(shù)據(jù)。
  4. 生成JPEG文件。將編碼后的數(shù)據(jù)寫入到JPEG文件中,即可生成JPEG格式的圖像數(shù)據(jù)。

以下是一個示例代碼,使用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格式的圖像數(shù)據(jù)
  get_rgb_data(rgb_buf, RGB_BUF_SIZE);
?
  // 將RGB565格式的圖像數(shù)據(jù)轉換為YUV420格式數(shù)據(jù)
  uint8_t yuv_buf[WIDTH * HEIGHT * 3 / 2];
  rgb_to_yuv(rgb_buf, WIDTH, HEIGHT, yuv_buf);
?
  // 對YUV420格式數(shù)據(jù)進行預處理
  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數(shù)據(jù)寫入到SD卡或其他存儲介質(zhì)中
  write_jpeg_to_sd_card(jpeg_buf, jpeg_size);
?
  while (1) {
    // 主循環(huán),處理其他任務
   }
}

TinyJPEG庫是一款通用的JPEG壓縮庫,使用時需要根據(jù)具體情況進行修改和適配。在具體實現(xiàn)時,還需要考慮圖像大小、壓縮比率、編碼質(zhì)量等因素,以便更好地滿足實際需求。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6030

    文章

    44491

    瀏覽量

    632024
  • STM32
    +關注

    關注

    2264

    文章

    10854

    瀏覽量

    354313
  • 攝像頭
    +關注

    關注

    59

    文章

    4793

    瀏覽量

    95280
  • RGB
    RGB
    +關注

    關注

    4

    文章

    797

    瀏覽量

    58339
  • JPEG
    +關注

    關注

    0

    文章

    66

    瀏覽量

    29926
收藏 人收藏

    評論

    相關推薦

    請問怎么在單片機中把十進制轉為十六進制的格式

    大家好,幫幫忙,在單片機中想把十進制X = 123456轉為十六進制 X = 0x123456的格式,有什么方法嗎,或者有代碼例子嗎?謝謝!
    發(fā)表于 09-29 10:20

    什么是測試單片機控制單色屏幕的最佳辦法

    什么是測試單片機控制單色屏幕的最佳辦法?將視頻轉為圖像數(shù)據(jù)的matlab代碼該如何去編寫?
    發(fā)表于 09-24 09:13

    如何去實現(xiàn)stm32單片機上RGB565圖像簡單處理呢

    如何去實現(xiàn)stm32單片機上RGB565圖像簡單處理呢?有哪些步驟?
    發(fā)表于 11-19 08:07

    STM32 tjpgd軟件JPEG解碼后RGB888數(shù)據(jù)格式不對怎么解決

    STM32上面使用TJPGD解碼后,發(fā)現(xiàn)RGB888的數(shù)據(jù)格式單片機或常規(guī)的RGB格式順序有
    發(fā)表于 02-17 07:56

    請問有大佬知道怎么將FPGA通過TCP傳輸?shù)?b class='flag-5'>RGB888圖像數(shù)據(jù)通過labview顯示為圖像嗎,感謝感謝

    新手小白,已經(jīng)嘗試過一些將JPEG圖像格式數(shù)據(jù)轉為圖像的例子,用RGB888格式
    發(fā)表于 10-30 21:16

    JPEG圖像數(shù)據(jù)格式簡明分析

    本文針對最常見的JPEG 圖像格式的壓縮數(shù)據(jù)進行分析,描述了每一字節(jié)的數(shù)據(jù)所表示的含義,同時也介紹了JPEG 圖像
    發(fā)表于 09-18 11:05 ?16次下載

    STM32單片機通過SPI發(fā)送與接收FLSAH應用案例

    使用STM32單片機通過SPI發(fā)送與接收FLSAH應用案例,部分程序可以轉移到其他單片機上
    發(fā)表于 10-28 15:25 ?14次下載

    基于STM32單片機數(shù)據(jù)記錄裝置設計

    基于STM32單片機數(shù)據(jù)記錄裝置設計
    發(fā)表于 09-28 16:03 ?17次下載
    基于<b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>的<b class='flag-5'>數(shù)據(jù)</b>記錄裝置設計

    是否要從單片機轉為嵌入式Linux?

    作者:嵌入式老鳥火哥授權轉載于公眾號嵌入式老鳥的職場之道(ID: ict_embedded),有增加內(nèi)容和修改。最近很多童鞋投票并咨詢?nèi)绾螐?b class='flag-5'>單片機轉為嵌入式Linux開發(fā)??磥碜x者圈中做單片機
    發(fā)表于 10-20 15:51 ?5次下載
    是否要從<b class='flag-5'>單片機</b><b class='flag-5'>轉為</b>嵌入式Linux?

    是否要從單片機轉為嵌入式Linux

    最近很多童鞋投票并咨詢?nèi)绾螐?b class='flag-5'>單片機轉為嵌入式Linux開發(fā)??磥碜x者圈中做單片機,RTOS的不少。盡管小編目前從事Linux/Android方面的嵌入式開發(fā)工作,但是讀書的時候也有5年左右單片
    發(fā)表于 11-13 20:51 ?11次下載
    是否要從<b class='flag-5'>單片機</b><b class='flag-5'>轉為</b>嵌入式Linux

    單片機串口發(fā)送數(shù)據(jù)格式_STM32實例——USART串口通信實驗(一)

    Labview發(fā)送指令給STM32單片機,控制單片機上LED燈亮滅。通信的基本概念我們知道 STM32F1 芯片內(nèi)含有非常多的通信接口,學習這些通信接口前,我們很有必要了解下通信的基.
    發(fā)表于 11-18 18:36 ?19次下載
    <b class='flag-5'>單片機</b>串口發(fā)送<b class='flag-5'>數(shù)據(jù)格式</b>_<b class='flag-5'>STM32</b>實例——USART串口通信實驗(一)

    51單片機的printf等格式輸出函數(shù)

    在51單片機上使用printf函數(shù)、sprintf函數(shù)要注意以下幾點:無符號16位數(shù)格式符用%d或者%u,千萬不能加字母“l(fā)”,否則會出錯32位數(shù)據(jù)格式符必須加字母“l(fā)”,否則會出錯8位數(shù)據(jù)格
    發(fā)表于 11-20 16:36 ?12次下載
    51<b class='flag-5'>單片機</b>的printf等<b class='flag-5'>格式</b>輸出函數(shù)

    STM32 tjpgd軟件JPEG解碼后RGB888數(shù)據(jù)格式問題

    STM32上面使用TJPGD解碼后,發(fā)現(xiàn)RGB888的數(shù)據(jù)格式單片機或常規(guī)的RGB格式順序有
    發(fā)表于 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'>數(shù)據(jù)格式</b>問題

    AN5246_SMPS在STM32WB系列單片機上的應用

    AN5246_SMPS在STM32WB系列單片機上的應用
    發(fā)表于 11-21 08:11 ?0次下載
    AN5246_SMPS在<b class='flag-5'>STM32</b>WB系列<b class='flag-5'>單片機上</b>的應用

    如何將FreeRTOS移植到STM32單片機上

    本文詳細介紹如何移植FreeRTOS到STM32單片機上。移植操作系統(tǒng)是嵌入式開發(fā)的入門基礎,單片機和嵌入式在物理上其實是一摸一樣的,區(qū)別就是軟件上嵌入式跑了操作系統(tǒng)而單片機沒有。本文
    的頭像 發(fā)表于 01-20 17:36 ?3188次閱讀
    如何將FreeRTOS移植到<b class='flag-5'>STM32</b><b class='flag-5'>單片機上</b>