福州大学《嵌入式系统综合设计》 实验十二:图像压缩标准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

相关文章

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一