福州大学《嵌入式系统综合设计》 实验九:ROI视频编码

一、实验目的

ROI视频编码即感兴趣区域视频编码,即针对感兴趣区域进行重点编码,提高编码质量,而对非感兴趣区域采用低质量编码。通过这种方法可以降低码率。本实验即让同学们能够在算能的FFMPEG接口下实现基于ROI的视频编码。

二、实验内容

在实验8的基础上,进一步实现ROI编码。即对图像不同区域设置不同的QP进行视频编码。

三、开发环境

开发主机:Ubuntu 20.04.6 LTS

硬件:算能SE5

四、实验器材

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

五、实验过程与结论

ROI视频编码原理

整帧视频图像的视觉质量很大程度上取决于感兴趣区域ROI部分的视觉质量,而非ROI的图像质量下降不易被察觉,对整帧图像的视觉质量影响较小, 感兴趣区域并不局限于人眼的感兴趣区域,在某些具体的工程应用中,可以将某些具体的场景或者事物定义为感兴趣区域。

感兴趣区域ROI的视频编码的基本方法如图所示,对于输入视频帧序列,通过特定的算法和视频帧本身的特性,提取出感兴趣区域和不感兴趣区域掩膜,并将其作为控制信息输入到视频编码器中,用其控制编码器编码当前帧相应的编码参数,包括量化参数,运动估计时的搜索区域大小和参考帧数目,以及预测模式范围等。感兴趣区域ROI提取模块起到预处理和控制器的作用,感兴趣区域提取涉及视觉显著性等,显著性是指视频帧序列中的能够引起 HVS 注意的物体所具有的特性,一般感兴趣区域的显著性可以表现为纹理、亮度、色度、对比度、形态、对比度等特征。

码率控制的目的是在给定的码率条件下,保证良好稳定的输出码流。按照粒度大小码率控制可分为 GOP 层、帧层以及宏块层(或者CTU层)。编码器通过对不同层级中编码单元分配不同的码率比计算相应的QP值。QP 越大,编码单元丢失的细节越多,图像的失真度增加,质量下降,同时码率也降低,随着 QP 的减小,编码单元的细节保留的增多,在提高质量的同时增大了码率。

在固定目标比特率的 CBR 编码模式中,编码器通过编码结果对每帧、每个宏块或者CTU分配不同的码率,动态计算调整 QP 大小,让最终编码的整体码率与给定码率接近。在基于ROI的编码方法中,在ROI 分析与提取的基础上,基于CBR 的码率控制模型,对宏块级的 QP 进行调整,即对 ROI 降低 QP 提高编码质量,对非 ROI 相应提高 QP。通过这种方式,视觉关注区域得到了更多的码率,而非视觉关注区域节省了非必要的码率分配,进而达到在整体码率不变的条件下,提升视频的主观视觉质量的目的。

关键核心代码讲解

设置ROI有效

ROI的设置是在编码过程中通过设置不同区域的QP来设置ROI,在设置之前需要在初始化编码器时设置ROI有效,因此,我们需要在实验8的openEnc函数中设置ROI有效,具体如下:

//av_dict_set_int(&dict, "qp", 25, 0);
av_dict_set_int(&dict, "roi_enable", 1, 0);

注意,上式中的av_dict_set_int(&dict, "qp", 25, 0)是实验8的代码,更换为ROI后需要删除。

设置QP

我们在实验8的基础上,在编码前设置图像不同区域的编码QP。本次实验对编码图像分成四个区域,如图所示,其中不同区域设置成不同的量化参数。在视频编码中,量化参数QP是非常重要的参数,它直接影响着视频的编码比特率。对于某些应用场合,尤其是当传输速率受限时,灵活地控制量化 参数使得编码速率尽量接近给定速率尤为重要。图中右下角区域每个编码单元(宏块或者CTB)QP设为较小的值,QP=10,该区域经过编码后,保留较多的细节信息。而其他三个区域QP=40,这几个区域可以获得较小的码率和较少的计算资源。

H264中ROI代码:

对于H.264编码器,首先计算每个宏块的索引位置(i,j),当判断当前宏块位于右下角区域时,QP设置为40,其他则设置为10。

#define BM_ALIGN16(_x)             (((_x)+0x0f)&~0x0f)
#define BM_ALIGN32(_x)             (((_x)+0x1f)&~0x1f)
#define BM_ALIGN64(_x)             (((_x)+0x3f)&~0x3f)  
AVFrameSideData *fside = av_frame_get_side_data(picture, AV_FRAME_DATA_BM_ROI_INFO);if (fside) {AVBMRoiInfo *roiinfo = (AVBMRoiInfo*)fside->data;memset(roiinfo, 0, sizeof(AVBMRoiInfo));if (enc_ctx->codec_id  == AV_CODEC_ID_H264) {roiinfo->customRoiMapEnable = 1;roiinfo->customModeMapEnable = 0;for (int i = 0;i <(BM_ALIGN16(height) >> 4);i++) {for (int j=0;j < (BM_ALIGN16(width) >> 4);j++) {int pos = i*(BM_ALIGN16(width) >> 4) + j;// test_1if ( (j >= (BM_ALIGN16(width) >> 4)/2) && (i >= (BM_ALIGN16(height) >> 4)/2) ) {roiinfo->field[pos].H264.mb_qp = 10;}else{roiinfo->field[pos].H264.mb_qp = 40;}}}} else if (enc_ctx->codec_id  == AV_CODEC_ID_H265) {roiinfo->customRoiMapEnable    = 1;roiinfo->customModeMapEnable   = 0;roiinfo->customLambdaMapEnable = 0;roiinfo->customCoefDropEnable  = 0;for (int i = 0;i <(BM_ALIGN64(height) >> 6);i++) {for (int j=0;j < (BM_ALIGN64(width) >> 6);j++) {int pos = i*(BM_ALIGN64(width) >> 6) + j;// test_1if ( (j > (BM_ALIGN64(width) >> 6)/2) && (i > (BM_ALIGN64(height) >> 6)/2) ) {roiinfo->field[pos].HEVC.sub_ctu_qp_0 = 10;roiinfo->field[pos].HEVC.sub_ctu_qp_1 = 10;roiinfo->field[pos].HEVC.sub_ctu_qp_2 = 10;roiinfo->field[pos].HEVC.sub_ctu_qp_3 = 10;} else {roiinfo->field[pos].HEVC.sub_ctu_qp_0 = 40;roiinfo->field[pos].HEVC.sub_ctu_qp_1 = 40;roiinfo->field[pos].HEVC.sub_ctu_qp_2 = 40;roiinfo->field[pos].HEVC.sub_ctu_qp_3 = 40;}roiinfo->field[pos].HEVC.ctu_force_mode = 0;roiinfo->field[pos].HEVC.ctu_coeff_drop = 0;roiinfo->field[pos].HEVC.lambda_sad_0 = 0;roiinfo->field[pos].HEVC.lambda_sad_1 = 0;roiinfo->field[pos].HEVC.lambda_sad_2 = 0;roiinfo->field[pos].HEVC.lambda_sad_3 = 0;}

H265中ROI代码:

对于H.265/HEVC编码器,编码标准制定了一种非常灵活的QP控制机制,它引入了量化组(Quantization Group, QG)的概念,规定一个CTB可以包含一个或多个固定大小的QG,同一个QG内的所有含有非零系数的CU共享一个QP,不同的QG可以使用不同的QP。这样一来,编码器能够更灵活地进行速率控制。

QG是指将一幅图像分成的固定大小(NxN)的正方形像素块。其大小N由图像参数集(PPS)指定,且必须处于最大CU与最小CU之间(包含最大与最小CU)。图中给出了一个32x32 QG的示意图,其中粗实线为CTB边界,粗虚线表示CU划分方式,细线为QG分界线。CU与QG没有固定的大小关系。由于在一幅图像中,QG为固定大小,而CU是根据视频内容自适应划分出来的,因此可能出现一个QG包含一个或多个CU的情形,也可能存在一个CU包含多个QG的情形。

实验过程

生成可执行文件:

makefile的写法与前面的例程基本相同,按照前面实验1、实验2步骤,生成可执行文件并上传到算能盒子或者云平台中。如果是在云平台上测试,则可将编译好的执行文件通过云空间文件系统上传。

root@d11ae417e206:/tmp/test# ls

ffmpeg_encode_withRoi  1080p.yuv

给可执行文件赋权限并执行。

root@d11ae417e206:/tmp/test# chmod 777 ffmpeg_encode_withRoi

运行指令:

生成并上传编译文件后,根据如下指令在目标开发机终端运行。

./ffmpeg_encode_withRoi 1080.yuv output.h264

运行结果如下:

[h264_bm @ 0x429a90] width =1920

[h264_bm @ 0x429a90] height=1080 src/allocator.c:136 (ion_dmabufalloc_map)  

DEBUG: retrieved virtual address for physical memory

src/allocator.c:144 (ion_dmabufalloc_map)  

DEBUG: Invalidated physical memory

src/allocator.c:155 (ion_dmabufalloc_map)  

DEBUG: virtual address:  0x7f820c8000  aligned: 0x7f820c8000

src/allocator.c:176 (ion_dmabufalloc_unmap)  

DEBUG: shut down virtual address for 3133440 bytes of physical memory

[h264_bm @ 0x429a90] input frame: context=(nil), pts=100, dts=-9223372036854775808

[85fb6010] src/enc.c:2264 (Wave5BitIssueCommand)  

instanceIndex=0: cmd=0x100

[85fb6010] src/enc.c:1647 (enc_start_one_frame)  

instance Index: 0. instance Queue Count: 1, total Queue Count: 1

[85fb6010] src/enc.c:733 (VpuHandlingInterruptFlag)  

INTR Done: enc pic. reason=0x100

[85fb6010] src/enc.c:2264 (Wave5BitIssueCommand)  

instanceIndex=0: cmd=0x4000

[h264_bm @ 0x429a90] output frame: context=(nil), pts=91, dts=87

enc_pkt.pts=91, enc_pkt.dts=87

rescaled enc_pkt.pts=46592, enc_pkt.dts=44544

Muxing frame

The end of file!

Flushing video encoder

[85fb6010] src/enc.c:2264 (Wave5BitIssueCommand)  

instanceIndex=0: cmd=0x100

[85fb6010] src/enc.c:1647 (enc_start_one_frame)  

instance Index: 0. instance Queue Count: 1, total Queue Count: 1

[85fb6010] src/enc.c:733 (VpuHandlingInterruptFlag)  

INTR Done: enc pic. reason=0x100

[85fb6010] src/enc.c:2264 (Wave5BitIssueCommand)  

instanceIndex=0: cmd=0x4000 [h264_bm @ 0x429a90] encoding end!

src/encoder.c:804 (bmvpu_enc_close)  

DEBUG: closing encoder src/allocator.c:112 (ion_dmabufalloc_deallocate)  

DEBUG: deallocated 262144 bytes of physical memory

src/allocator.c:112 (ion_dmabufalloc_deallocate)  

DEBUG: deallocated 262144 bytes of physical memory

src/allocator.c:112 (ion_dmabufalloc_deallocate)  

DEBUG: deallocated 262144 bytes of physical memory

src/allocator.c:112 (ion_dmabufalloc_deallocate)  

DEBUG: deallocated 262144 bytes of physical memory

src/encoder.c:295 (bmvpu_enc_unload)  

DEBUG: unloaded VPU [AVIOContext @ 0x499190] Statistics: 2 seeks, 7 writeouts

encode finish!

#######VideoEnc_FFMPEG exit

注:上图展示为部分关键运行结果,详细运行结果请见运行界面。

Elecard StreamEye分析

对视频文件进行ROI编码后,用Elecard StreamEye分析码流。通过播放编码后的视频可以看出,右下角区域比其他区域的清晰度更高,细节保留的更多。左下角使用较大的QP,使得图像细节丢失,木板的间隙模糊,人工效应明显。而右下角区域使用较小的QP编码,则相对清晰。

同时可以调出MB信息查看每一个编码单元的QP值,可以看出,右下角的QP值更低,其他区域的QP值更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离散化笔记

文章目录 离散化的适用条件离散化的意思AcWing 802. 区间和CODECODE2 离散化的适用条件 离散化用于区间求和问题对于数域极大&#xff0c;而数的量很少的情况下 离散化的意思 背景&#xff1a;对于一个极大数域上的零星几个数进行操作后&#xff0c;求某段区间内的和 其实意思…

JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析

JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析 文章目录 JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析1. 背景1.系统使用jsch这个框架做文件发送以及远程命令执行的操作,系统一直运行正常,直到某一个环境发现 2.…

关于我司在上海物联网行业协会展厅展示项目案例

1 项目背景 上海市物联网行业协会&#xff08;SIOT&#xff09;是由本市物联网行业同业企业及其他相关经济组织自愿组成、实行行业服务和自律管理的非营利性社会团体法人&#xff0c;于2012年&#xff0c;经上海市经济和信息化委同意&#xff0c;在上海市社团局登记成立。 本…

pat模拟题—7-11 两个序列的中位数

一个长度为n(n⩾1)的升序序列S,处在第2n​个位置的数称为序列S的中位数(median number),例如&#xff0c;序列S1{10,13,14,16,18,19}的中位数是14。两个序列的中位数是它们所有元素的升序序列的中位数&#xff0c;例如&#xff0c;S2{2,4,8,9,20,21},则S1和S2的中位数是13。现有…

vue3中 watch、watchEffect区别

watch是惰性执行&#xff0c;也就是只有监听的值发生变化的时候才会执行&#xff0c;但是watchEffect不同&#xff0c;每次代码加载watchEffect都会执行&#xff08;忽略watch第三个参数的配置&#xff0c;如果修改配置项也可以实现立即执行&#xff09;watch需要传递监听的对象…

【精选】Spring整合MyBatis,Junit 及Spring 事务Spring AOP面向切面详解

Spring整合MyBatis 搭建环境 我们知道使用MyBatis时需要写大量创建SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等对象的代码&#xff0c;而Spring的作用是帮助我们创建和管理对象&#xff0c;所以我们可以使用Spring整合MyBatis&#xff0c;简化MyBatis开发。 …

SDK emulator directory is missing

要进行uniapp真机测试&#xff0c;不得不安装配置一下安卓开发环境 &#xff0c;搞一个模拟器。。。然后又是各种坑。。对比来对比去还是IOS的环境使用着舒服&#xff0c;XCODE下载好&#xff0c;一切重点就是在编码了。。 安卓这个脑残货呀&#xff0c;哎&#xff0c;各种安装…

记录 | rm -rf 删除除了指定文件以外的文件,以及在Bash脚本中的使用方法

一般 rm -rf 的用法是&#xff1a; # 删除当前目录所有文件 rm -rf ./*但要是想删除当前目录除了 aa.txt以外的其他所有文件呢&#xff0c;该怎么办呢&#xff1f; 命令如下&#xff1a; rm -rf !(aa.txt)然而这个时候可能会报错&#xff1a; bash: !: event not found 这是因…

rust 基本数据类型

Rust 是 静态类型&#xff08;statically typed&#xff09;语言&#xff0c;也就是说在编译时就必须知道所有变量的类型&#xff0c;基本类型如下 整型 整数 是一个没有小数部分的数字长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisi…

【开题报告】基于SSM的高端茶具选购系统的设计与实现

1.选题背景 近年来&#xff0c;随着人们生活水平的提高以及对健康生活的追求&#xff0c;茶文化逐渐在人们的生活中占据了重要地位。茶具作为茶文化的重要组成部分&#xff0c;对于制茶、品茶都有着至关重要的影响。因此&#xff0c;如何选购合适的高端茶具成为了越来越多茶友…

数据挖掘之时间序列分析

一、 概念 时间序列&#xff08;Time Series&#xff09; 时间序列是指同一统计指标的数值按其发生的时间先后顺序排列而成的数列&#xff08;是均匀时间间隔上的观测值序列&#xff09;。 时间序列分析的主要目的是根据已有的历史数据对未来进行预测。 时间序列分析主要包…

whatsapp信息群发脚本开发!

WhatsApp 作为全球广受欢迎的通讯应用&#xff0c;在我们的日常生活中扮演着重要角色&#xff0c;有时候&#xff0c;我们需要向大量联系人发送消息&#xff0c;比如营销推广、活动通知等。 一个个手动发送消息?那简直太落后了!今天&#xff0c;我们将探讨如何利用脚本开发实…

centos nginx安装及常用命令

nginx配置文件位置 nginx 安装有两种方式一种是联网一键下载&#xff0c;Nginx 配置文件在 /etc/nginx 目录下&#xff0c;一种是源码包可以无网下载&#xff0c;有两个配置文件启动地方一个是安装包存放位置&#xff0c;一是/usr/local/nginx/conf下&#xff0c;启动要看你…

MxL3706-AQ-R 2.0通道绑定同轴网络集成电路特性

MxL3706-AQ-R是Max线性公司的第三代MoCA2.0同轴网络控Z器SoC&#xff0c;可用于在现有的家庭同轴电缆上创建具有千兆位吞吐量性能的家庭网络。 该MxL3706-AQ-R工作在400MHz至1675MHz之间的无线电频率&#xff0c;并与satellite共存&#xff0c;电X和有线电视运营商的频率计划。…

前端:HTML鼠标样式及其对应的CSS属性值

1、默认箭头样式&#xff1a; selector {cursor: default; } 2、手型样式 selector {cursor: pointer; } 3、文本选择样式&#xff1a; selector {cursor: text; } 4、移动手型样式&#xff1a; selector {cursor: move; } 5、缩放手型样式&#xff1a; selector {cur…

Nginx 实现动静资源分离和负载均衡

1、相关概念 静态资源 .html .jpg .css .js等&#xff0c;没有后台数据库&#xff0c;不含程序&#xff08;如php、jsp、asp等&#xff09;的网页 动态资源 需要访问数据库的资源都属于动态资源 静态请求 用户发起的请求只访问到前端资源&#xff0c;不访问数据库 动态请求…

利用pytorch实现卷积形式的ResNet

利用pytorch实现卷积形式的ResNet 1. 导入必需的库2. 定义残差块3. 构建 ResNet 网络4. 实例化网络和训练 要使用 PyTorch 实现卷积形式的 ResNet&#xff08;残差网络&#xff09;&#xff0c;你需要遵循几个主要步骤。首先&#xff0c;让我们概述 ResNet 的基本结构。ResNet …

让 OpenAI GPT4 出 10 道题测试其他开源大语言模型

让 OpenAI GPT4 出 10 道题测试其他开源大语言模型 1. 中文题目及答案2. 日文题目及答案3. 英文题目及答案 1. 中文题目及答案 数学题&#xff1a;一个矩形的长是10厘米&#xff0c;宽是5厘米&#xff0c;求它的面积。 答案&#xff1a;面积 长 x 宽 10厘米 x 5厘米 50平方厘…

金属款超声波风速风向传感器的创新与科技力量

在当今的科技世界中&#xff0c;WX-WQX2S 金属款超声波风速风向传感器以其独特的功能和可靠的性能&#xff0c;引领着气象科技领域的新潮流。这款传感器利用超声波技术&#xff0c;对风速和风向进行高精度测量&#xff0c;为气象学家和环境监测机构提供了强大的工具。 一、金属…

基于STM32单片机的智能家居系统设计(论文+源码)

1.系统设计 基于STM32单片机的智能家居系统设计与实现的具体任务&#xff1a; &#xff08;1&#xff09;可以实现风扇、窗帘、空调、灯光的开关控制&#xff1b; &#xff08;2&#xff09;具有语音识别功能&#xff0c;可以通过语音控制家电&#xff1b; &#xff08;3&a…