基于H.264算法的嵌入式视频采集及编码优化分析

2022-06-28 03:18黄如兵
兰州工业学院学报 2022年2期
关键词:编码器嵌入式像素

黄如兵

(安徽职业技术学院 信息工程学院,安徽 合肥 230011)

近年来,随着嵌入式技术的发展,嵌入式芯片的稳定性、扩展性得到了大力提高,有关嵌入式监控系统的研究成为热点。基于嵌入式的监控系统已广泛应用于国防安全、救灾抢险、安防监控、海航探索等领域[1-3]。崔秀芳等人基于嵌入式树莓派底板实现了便携式渔船监控系统设计[4]。彭磊、唐浩漾等人实现监控系统中的大十字搜索及菱形搜索判定运动估计算法优化[5-6]。李博文等设计了嵌入式Linux视频监控系统,实现视频的远程传输[3]。

帧间预测的运动估计算法在图像编码中占据至少1/2的编码时间和时间复杂度,运动估计中块匹配算法(BAM)的优化和研究尤为重要,常用的有全搜索算法、三步法、四步法、菱形搜索算法等,这些算法采用运动矢量中心偏移方式进行计算,搜索会陷入局部最优化。本文根据H.264编码标准,提出了x264编码器基于嵌入式平台的算法优化方法,在编码器运动估计中采用改进的DIA搜索模式,将优化后的x264编码器移植至嵌入式系统,编写上层应用程序,完成基于H.264的嵌入式监控系统设计。改进的x264编码器编码效率更高,代码简练,系统应用良好。

1 监控系统的软硬件结构

嵌入式系统一般有嵌入式硬件结构和嵌入式软件结构组成,嵌入式硬件结构主要有ARM硬件电路、视频采集模块、网络传输模块组成,监控平台硬件结构如图1所示。嵌入式软件结构主要由底层嵌入式硬件结构、嵌入式操作系统、嵌入式应用程序组成,嵌入式软件结构中的上层应用可调用操作系统接口,再调用内核驱动,完成程序功能。

图1 嵌入式视频采集及编码系统硬件结构

系统采用USB摄像头连接硬件电路,图像采集程序调用Linux系统的Video for Linux(V4L)接口,V4L是Linux操作系统下的视频采集接口(API)。V4L2是V4L改进升级版接口,V4L2接口使用更灵活,对底层硬件支持更丰富,在Linux操作系统底层驱动中需要选择UVC标准的摄像头驱动,并将驱动编译入内核,才能通过UVC摄像头实现图像采集。视频图像采集通过调用Linux操作系统内核的V4L2接口函数实现[2],采集到的YUV422格式图像数据,存放于内存中,后期由H.264编码压缩处理。

2 H.264编码技术

摄像头基于V4L2将视频图像采集并存放于缓存空间,原始数据需要通过视频图像编码处理后才具备压缩率高、质量好的特点,从而减少数据量,节省传输带宽。H.264编码算法具有较高的压缩率、网络传输适应性良好等特点。

2.1 H.264编码算法

H.264采用视频编码层(VCL)压缩视频图像数据,采用网络抽象层(NAL)打包和传输编码压缩后的数据。H.264编码器结构可分为:基于宏块的帧内预测、图像的帧间预测、DCT变换及量化、无损熵编码,H.264编码器工作原理如图2所示。

图2 H.264编码器工作原理

2.2 x264编码器

x264是一个使用广泛的开源H.264视频编码函数库,系统可采用H.264编码器的基本档次编码方式,确保系统具有较强的实时性。x264编码器的主要模块算法实现情况如下。

1)图像帧内预测。

在帧内预测中,Y为亮度分量,采用4×4宏块、16×16宏块大小方式进行预测,2种规格的预测模式分别有9种和4种;U、V为色度分量,采用了8×8宏块大小进行预测,该规格的预测模式有4种。

① 16×16亮度预测模式。

16×16宏块预测方式有4种,分别是:模式0:垂直预测、模式1:水平预测、模式2:DC模式预测、模式3:平面模式预测,如图3所示。

图3 16×16亮度预测模式

其运算如式(1)~(6)所示,其中模式0的垂直模式算式如(1),模式1的水平模式算式为(2),模式2的DC模式算式为(3)~(5),模式3的平面模式算式为(6)。

pr(x,y)=p(x,-1),x,y=0,1,…,15,

(1)

pr(x,y)=p(-1,y),x,y=0,1,…,15,

(2)

pr(x,y)=

x,y=0,1,…,15,

(3)

x,y=0,1,…,15,

(4)

x,y=0,1,…,15,

(5)

平面模式的预测公式如式(6),即

pr(x,y)=Clip1((a+b·(x-7)+c·(y-7)+16)>>5).

(6)

② 4×4亮度预测模式。

H.264标准编码中大小为16×16规格的块可进一步分割成16个大小为4×4的小模块,其中4×4的子模块预测模式有9种,模式2为DC模式,其他8种预测模式如图4所示。

(a)像素邻近点编号 (b)8个方向预测模式

③ 8×8色度预测模式。

色度分量采用8×8块方式预测,有4种预测模式,其预测方式与亮度分量中的16×16宏块的预测方式一致。

2)图像帧间预测。

帧间预测采用已编码的图像来预测下一帧编码的图像,采用基于宏块和像素的运动估计技术(ME)和运动补偿技术(MC),来减少时域上的冗余信息,从而进一步压缩图像数据。H.264编码的帧间预测块尺寸使用了1/4精度的运动矢量。

① 树状结构的运动补偿。

帧间预测需要将宏块划分成树状结构,16×16的亮度宏块可划分为:16×16块结构,8×16块结构,16×8块结构;8×8块结构块可以进一步分割成8×4块结构、4×8块结构以及4×4小块结构。

② 高精度运动矢量。

为了提高矢量运算精确度,编码器采用1/4精度来运算运动矢量。可由整数像素值按照插值算法计算得到1/2像素点的值,再通过1/2像素点的值及整数点值根据插值算法得到1/4像素点值。插值运算采用六阶滤波器插值算法计算,插值运算方法如图5所示。

图5 H.264中1/2像素插值运算

图中“h”像素和“b”像素运算,可使用6抽头滤波器(1,-5,20,20,-5,1)插值运算,滤波插值算法为

b1=(E-5F+20G+20H-5I+J),

(7)

h1=(A-5C+20G+20M-5R+T),

(8)

b=(b1+16)>>5,

(9)

h=(h1+16)>>5.

(10)

图中像素“j”,可以通过6个邻近水平位置或者6个邻近垂直位置的像素根据插值算法运算得到,同理,可计算出1/4像素点的值,像素“j”的运算式为

j1=cc-5dd+20h+20m-5ee+ff,

(11)

j=(j1+512)>>10.

(12)

3)DCT变换及量化。

H.264编码中对4×4块进行DCT变换,提取矩阵中的直流分量,组建4×4矩阵后,再进行Hadamard变换。H.264采用标准量化,FQ是输出量化系数,y是矩阵Y的转换系数,QP是量化步长。量化过程为

(13)

4)熵编码。

进行DCT变换后进一步去除了相关数据的冗余信息,再经熵编码实现数据的无损压缩,H.264中熵编码方式主要有CAVLC 和CABAC两种,CAVLC是自适应变长编码方式,主要用于H.264基本档次编码中;CABAC是自适应二进制算术编码方式,在H.264标准的主要档次编码中采用熵编码数据后再送入去块滤波器滤波,进而降低块效应和振铃效应。

3 编码器改进与优化

根据ARM-Linux嵌入式平台特性,优化编码器算法、适当降低算法复杂度,能有效提高编码速度,提高系统视频编码传输的实时性,针对x264实现了编码器参数设置优化、编码器算法优化,针对嵌入式平台实现了编译器优化。

3.1 x264编码器代码优化

1)为提高x264编码实时性,屏蔽B帧预测方式,并根据macroblock模块函数代码,修改并优化了I帧预测模式,去除了对4×4块的支持,从而降低了算法复杂度,提高系统编码的实时性。

2)针对平台特性,在帧间预测代码中注释了1/4像素精度运算代码,深度研究了HEX六边形搜索、DIA菱形搜索、ESA连续消除法、UMHexagonS不均匀的多六边形搜索算法并优化。

3)代码简化,去除了AVI、MP4格式代码部分,减少分支判断运算耗时;在代码中去除B帧参考相关内容,例如函数if(h->fenc->i_type == X264_TYPE_BREF)、x264_macroblock_bipred_init()初始化等函数均可去除。

3.2 优化改进DIA搜索算法

采用改进的DIA搜索模型,首先通过在水平与垂直方向搜索更多的点,以便提高搜索精度。搜索过程分为2步,第一步按17个点构成六边形-正方形-菱形钻石模型搜索,第二步按照上一步搜索结果,匹配 SAD 最小值位置,从而确定新中心,再以六边形、正方形、钻石模型搜索,计算SAD最小的点,匹配到对应像素点后停止搜索。算法搜索过程如图6所示,具体步骤如下:

图6 改进的DIA搜索模型

① 使用当前点为中心,搜索中心点及周边16个点,计算并确定标准SAD最小值,即最佳点所在位置。

② 以①中确定的SAD最小值位置最佳点为中心,按照六边形或大菱形进行搜索,进一步搜索计算,将最小匹配最佳点分为Ⅰ、Ⅱ、Ⅲ 3个类别。如图6中,中心点为Ⅰ类,中环连线上各点为Ⅱ类,外围六边形上各点为Ⅲ类。

③ 若最小匹配的最佳点为Ⅰ类,该位置的点就是中心点,则停止搜索。

④ 若最小匹配最佳点为Ⅱ类,根据最佳点的所处位置进一步通过六边形模板和正方形模板搜索,直到该点为中心点时停止搜索。

⑤ 若最小匹配点为Ⅲ类,直接选用大钻石模板,反复搜索匹配中心位置,最后通过小菱形搜索精细定位,搜索到某点为Ⅰ类,即中心点时停止搜索。

3.3 编译器参数优化

结合ARM平台实现交叉编译,将编译器的优化等级调到-O3选项,可以实现代码层面的高级别优化;在编译阶段添加-g、-Wall选项,编译后去除调试信息,进一步缩减了代码量。下载x264的源码,修改x264源码中的config.mak文件,指定编译选项:AR=arm-linux-arrc、ARCH=ARM、SYS=LINUX、RANLIB=arm-linux-ranlib、CC=arm-linux-gcc、STRIP=arm-linux-strip,执行make实现编译,编译后的libx264.a、libx264.so库函数为应用程序提供应用接口。

3.4 编码程序设计

编码程序将采集后存放于内存的YUV图像数据进行编码压缩,编码程序设计流程如图7所示。

图7 H.264编码程序流程

3.5 优化结果分析

为了进一步测试算法改进前后在不同运动剧烈程度中的表现情况,选取了hallmonitor、my_laboratory两种不同剧烈程度的视频序列作为测试序列。根据ARM平台特性,通过对x264编码器代码优化、帧间预测搜索算法优化、编译器参数等方面进行优化。使用优化改进的DIA搜索模型,将交叉编译后的编码器及应用程序移植到嵌入式ARM平台进行测试。测试序列使用my_laboratory和hallmonito进行测试,将编码器优化前后的性能数据进行对比,优化前后的效果通过指标参数分析:优化后的编码帧率性能得到提升,优化后图像信噪比PSNR略微下降,图像质量基本得到保证,但运动估计时间得到有效降低,编码速度得到了大幅度提高。表1为针对ARM平台,原编码器及优化后编码器的性能对比情况。

表1 编码测试分析

4 结语

本文设计了基于H.264编码算法的嵌入式视频采集及编码系统,该系统基于ARM-Linux平台,通过V4L2接口实现视频图像采集程序设计。视频图像的编码基于H.264编码实现,根据嵌入式ARM架构的特性,针对x264编码器,提出了x264编码器基于嵌入式平台的算法优化方法,采用改进的DIA搜索模式实现了编码器运动估计搜索优化,优化后的编码器更适用于嵌入式ARM平台上,编码效率良好。通过测试验证,基于H.264编码算法完成了视频图像编码系统设计,系统具有更高的编码压缩效果,压缩效率有明显提高,系统运行稳定、实时性高、组网灵活、可扩展性强。

猜你喜欢
编码器嵌入式像素
融合CNN和Transformer编码器的变声语音鉴别与还原
像素前线之“幻影”2000
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
“像素”仙人掌
TS系列红外传感器在嵌入式控制系统中的应用
搭建基于Qt的嵌入式开发平台
基于双增量码道的绝对式编码器设计
ÉVOLUTIONDIGAE Style de vie tactile
应用旋转磁场编码器实现角度测量
高像素不是全部