福州大学《嵌入式系统综合设计》 实验十二:图像压缩标准JPEG编解码

本文主要是介绍福州大学《嵌入式系统综合设计》 实验十二:图像压缩标准JPEG编解码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实验目的

掌握基于算能平台的JPEG压缩编码方法以及开发环境,包括开发主机环境搭建,硬件嵌入式开发板的连接,云平台的配置,编码程序的编译、运行等。

二、实验内容

搭建实验开发环境,并编写静止图像jpeg格式编解码程序,输入端读取原始图像数据,选择编解码模式,输出压缩编码结果。在目标开发机运行测试,验证开发环境。如果是基于云平台虚拟环境,则需要将编译好的程序代码上传云平台进行测试运行。

三、开发环境

开发主机:Ubuntu 20.04.6 LTS

硬件:算能SE5

四、实验器材

开发主机 + 云平台(或SE5硬件)

五、实验过程与结论

实验原理概述

本小节重点讨论JPEG编解码实验。JPEG是当前流行的静态图像压缩格式,从创造至今已经过去几十年,但依然是当今互联网时代的主要图像压缩标准。原始未压缩的图片,经过压缩算法运行后,生成jpeg格式的压缩图片。其占用的对于原始图像数据空间更小,更有利于图像文件的存储和传输。PEG编码包括预测编码、变换编码、量化、熵编码等过程,在之前的理论课程中已经充分学习并熟练掌握其基本原理。本实验的JPEG编解码实现代码通过直接调用OpenCV库实现。

算能的OpenCV库提供了imencode和imdecode分别进行编码和解码。和OpenCV的其他函数使用方法一样,imencode和imdecode同样针对Mat数据进行处理。在imencode函数中读取Mat数据格式图片进行编码,在imdecode将解码后的数据通过Mat数据格式返回。

编解码实验过程

JPEG编码:

本实验可以封装FnEncode函数用于进行编码,函数关键代码如下:

void FnEncode(const char *filenpath, int output_en)
{Mat save = imread(filenpath, IMREAD_UNCHANGED);vector<uint8_t> encoded;imencode(".jpg", save, encoded);                  //编码if (output_en){char *str = "encodeImage.jpg";int bufLen = encoded.size();if (bufLen){uint8_t *pYuvBuf = encoded.data();FILE *fclr = fopen(str, "wb");fwrite(pYuvBuf, 1, bufLen, fclr);        //编码后的数据写入文件fclose(fclr);}}
}

JPEG解码:

本实验可以封装FnDecode函数用于进行编码,函数关键代码如下:

void FnDecode(const char *filenpath, int output_en)
{ifstream in(filenpath, ios::binary);string s((istreambuf_iterator<char>(in)), (istreambuf_iterator<char>()));in.close();vector<char> pic(s.c_str(), s.c_str() + s.length());Mat image;imdecode(pic, IMREAD_UNCHANGED, &image);        //解码if (output_en){char *str = "decodeImage.bmp";imwrite(str, image);                        //解码后写入文件}
}

 主函数:

最后我们通过封装主函数,分别对输入的图片进行编码或解码:

int main(int argc, char *argv[])
{..... switch (codec_type){case 1:/* code */FnEncode(input_file.data(), outputEnable);cout << "encode finish ." << endl;break;case 2:FnDecode(input_file.data(), outputEnable);cout << "decode finish ." << endl;break;default:cout << "please input correct codec type number." << endl<< "   "<< " [codec-type] - the codec type you want to use . 1 -> encode ,2 -> decode" << endl;break;}
}

如上所示,我们可以在主函数中根据用户输入不同的codec_type即编码或者解码,分别对输入的图片进行编码和解码。outputEnable是由用户指定是否输出到文件。

执行与测试

本地编译后上传到云平台或者本地SE5盒子中的过程与前面的方法相同,这里不再赘述。上传完成后,在终端中输入指令:

root@d11ae417e206:/tmp/test# ./jpeg_EncDec lena.bmp 1 1

 各个指令的解释如下表所示:

指令:./test_ocv_jpumulti  <inputfile>  <test type>  <isOut>

参数说明:

  • inputfile: 输入图像文件
  • test type: 选择测试功能, 1: 编码, 2: 解码,
  • IsOut: 是否输出到文件, 0: 不生成输出文件, 1: 生成输出文件

 编码输出结果如下:

root@211bf635cafb:/tmp/test# ./test_ocv_jpumulti lena.bmp 1 1

输入文件的路径:lena.bmp
编解码类型:11-编码2-解码
Open /dev/jpu successfully, device index = e, jpu fd = 6,vpp fd = 7

编码完成
root@211bf635cafb:/tmp/test# ./test_ocv_jpumulti EncodeImage.jpg 2 1

输入文件的路径:EncodeImage.jpg
编解码类型:21-编码2-解码
Open /dev/jpu successfully, device index = e, jpu fd= 4, vpp fd = 5

解码完成

结果分析:根据指令我们选择编解码模式1,也就是编码,输入为图片:lena.bmp,选择输出到图片(isOut=1)。结果显示,65KB的图片压缩成了15KB;另外,我们再运行一次程序,选择编解码模式2,也就是解码,输入刚才编码输出的图片EnCodeImage.jpg,进行解码,同样也选择解码文件输出输出到图片(isOut=1)。结果显示,15KB的压缩图片还原成了65KB,并得到了指定的原来的格式的图片DecodeImage.bmp。

信息如下图所示。

 

这篇关于福州大学《嵌入式系统综合设计》 实验十二:图像压缩标准JPEG编解码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/436531

相关文章

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.