(北京特种机械研究所,北京 100143)
目前实时视频采集与处理系统在智能武器装备、工业自动化生产等领域有着广泛的应用。由于实时视频采集与处理系统要求处理器具有较高的数据带宽和处理速度,这对于高配置的PC机系统能满足要求,但PC机系统一般体积较大,操作系统规模大,不稳定性增多,同时功耗较大,存在散热问题;而对于多数DSP或单FPGA方案存在难以满足高数据带宽和处理速度的要求,对于DSP+FPGA的扩展方案,系统又变得复杂,且产品也难以满足小型化、集成化要求。为此,本文基于Xilinx公司高性能Zynq-7000SoC芯片,设计了一种小型集成化通用视频采集与处理平台系统,利用HLS工具将图像预处理算法快速打包生成IP核,在PL中实现图像算法硬件加速设计,提高了视频采集与处理快速性和实时性,通过实例和性能对比测试验证了系统的有效性。
基于SoC的实时视频高速采集处理系统原理框图如图1所示,系统主要由高速CMOS摄像头传感器, Zynq-7000 SoC可扩展处理平台、数据存储单元DDR3和VGA视频显示器等组成。Zynq-7000 SoC可扩展平台作为整个实时处理系统的核心,包括ARM处理系统(Processing System,PS)和FPGA可编程逻辑(Programmable Logic,PL)两部分,其中PS部分包含了最高可运行在1 GHz的双Cortex-A9核,高性能的DDR3控制接口和大量的通用外设接口,PL部分为Xilinx最新的28 nm工艺FPGA,可提供100 Gb/s的内部带宽,内部逻辑资源非常丰富,PS和PL之间通过高速AXI总线互联进行通信,片内带宽足够大,消除了芯片间互联存在的带宽瓶颈问题。
根据数据流向,系统读取外界视频数据信息的流程为:PL部分负责从CMOS图像传感器中获取视频信息,通过数据转换IP核将视频数据从BAYER格式转化为RGB数据格式,然后传送到图像预处理模块实现对RGB像素信息的各种预处理,如灰度化、滤波、边缘化等,此模块利用Xilinx的HLS工具,通过C语言编程实现各种图像预处理IP核的快速定制,而后通过VDMA IP核将处理后的视频数据传输至DDR3内存芯片中存储,最后PS从DDR3内存芯片中读取经帧缓冲的图像数据,进一步对视频特征信息进行处理和计算,处理结果不仅可以通过千兆以太网进行远传,而且可以通过VDMA IP核、VGA接口控制IP核在显示器上进行实时显示。
图1 系统原理框图
摄像头模块采用OmniVision公司的0V5640摄像头模块,具有高帧频、可配置、低功耗、低成本等优点,该摄像头模块CMOS阵列大小为2592×1944,能够采集多种分辨率的图像,最高可支持500万像素分辨率,在最高分辨率下帧率可达15fps,在1080p时帧率可达30fps。同时,可通过SPI口配置OV5640片上控制寄存器,实现对摄像头时序、信号极性等功能灵活配置。
0V5640摄像头使用Bayer颜色格式,即CMOS芯片的感光阵列中,每个单元都只含有红、绿、蓝三者之一的滤镜。为了得到RGB像素,需要通过相应的算法将Bayer颜色格式转换为RGB格式,即首先根据摄像头输出的同步信号以及数据有效信号,采集摄像头原始数据;然后运用双线性插值法将这些原始数据进行处理,最终得到RGB像素。该算法通过在PL内封装摄像头数据转换IP核实现,以提高数据的处理速度。
视频预处理模块用于实现对视频图像的预处理功能,如灰度化、二值化、滤波、边缘化等。本文利用Xilinx公司的HLS工具,将图像预处理算法通过C语言代码综合、仿真生成高效的RTL电路,并打包生成IP核,在PL中实现了图像预处理算法的并行计算,通过这种算法的硬件加速模式使视频图像处理的实时性得到极大提高。下文利用HLS工具对Sobel边缘检测算子的硬件加速过程进行了详细介绍。
1.2.1 Sobel边缘检测
Sobel边缘检测算子主要用于灰度图像的边缘检测,能够有效检测出物体的轮廓。Sobel算子包含两组矩阵,大小为3×3,如图2所示,分别为横向算子和纵向算子。在一幅图像中,用算子对图像进行卷积运算,分别得到图像横向和纵向的亮度差分近似值。
图2 Sobel算子
如果以A代表待处理的图像,以GX和Gy分别代表经过横向、纵向算子卷积后的图像灰度值,那么公式如(1)、(2)所示:
*A
(1)
(2)
以f(x,y)表示图像A中(x,y)点的灰度值,那么由式(1)、(2)展开得式(3)、(4):
GX=[f(x+1,y-1)+2×f(x+1,y)+
f(x+1,y+1)]-[f(x-1,y-1)+2×f(x-1,y)+
f(x-1,y+1)]
(3)
Gy=[f(x-1,y-1)+2×f(x,y-1)+
f(x+1,y-1)]-[f(x-1,y+1)+2×f(x,y+1)+
f(x+1,y+1)]
(4)
图像中每一个像素的横向及纵向灰度值大小由式(5)计算得到。
(5)
为了在FPGA中提高运算效率,将式(5)近似为式(6)。
G=|GX|+|Gy|
(6)
1.2.2 HLS实现Sobel算子
在HLS工具中,包含了一个专用于视频处理的Vivado HLS视频处理开源函数库,库中的函数和OpenCV函数具有相似的接口和算法,可用于实现很多基本的OpenCV函数功能,但它是针对FPGA架构实现的图像处理函数,与OpenCV函数又有着本质的区别。由于在HLS视频处理函数库中有Sobel函数,因此可以直接采用此函数通过C或C++代码综合、仿真生成高效的RTL电路,而后打包生成功能IP核,从而大大提高了图像预处理算法开发效率。Sobel算子IP核的开发设计流程如图3所示。
图3 基于HLS实现Sobel算子设计流程
首先利用HLS工具自带约束指令将接口约束为AXl4-Stream总线,并利用HLS视频处理函数库中提供的AXl4-Stream与hls::Mat转换函数实现Mat类型的转换,定义hls::Mat类型的变量,用于存放处理过程中的临时Mat。
然后,将Mat类型的图像由三通道的彩色图像转换成单通道的灰度图像:
RGB_IMAGE src(rows,cols);
GRAY_IMAGE gray(rows,cols);
GRAY_IMAGE sobel(rows,cols);
其中,RGB-IMAGE与GRAY-IMAGE的区别在于通道数,RGB_IMAGE有三通道,GRAY-IMAGE有一个通道。每个hls::Mat的高度为rows,宽度为cols。
而后通过调用HLS函数库中的Sobel算法对灰度化图像进行边缘化处理,并将处理后的Mat类型图像转换成视频流的格式输出,核心函数为:
#program HLS dataflow
hls::AXIvideo2Mat(input,src);
hls::CvtColor
hls::Sobel<1,0,3>(gray,sobel);
hls::Mat2AXIvideo(sobel,output);
最后进行代码综合,综合完毕后,需要对HLS的RTL进行仿真。HLS工具可以通过调用hls_opencv.h头文件,调用OpenCV函数,对生成的模块进行功能仿真,最终打包生成sobel算子IP核。在打包生成IP核同时也生成了一些头文件和C文件,这些文件中包含IP核的寄存器定义和偏移地址,以及IP核的驱动函数API等。
存储器直接访问(Direct Memory Access,DMA)技术是用于数据快速交换的一种重要技术,它具有独立于CPU的后台批量数据传输能力,能够满足实时图像处理中高速数据传输要求,利用PS上的AXI_HP高速接口完成把经预处理的图像经过VDMA(视频直接内存存取)直接缓存在由设备驱动程序预设的DDR3内存中,从而大大提高可编程逻辑部分与处理器部分图像传输速度,为视频数据高速传输提供了保障。
在本系统中,VDMA IP核将AXI4-Stream数据转换成AXI4总线,实现视频数据的DDR3存储;同样也将AXI4总线转换成AXI4-Stream数据流,实现存储器数据的读取;具体的读写地址、读写数据量的大小等由PS端通过AXI4-Lite总线进行配置。VDMA IP核实质是一个总线转换IP,实现AXl4-Stream与AXl4总线间数据的高速转换。本文调用了Vivado中自带的VDMA IP核,其结构如图4所示。
图4 VDMA IP核结构框图
该模块实现将VDMA 的AXI4-Stream格式的输出信号转换成VGA时序信号,以便能够和VGA接口显示器相连。FPGA并行计算的优势,满足了VGA数据实时更新与显示的要求。VGA接口控制IP核的结构如图5所示,主要由异步FIFO、FIFO的写逻辑、输出同步模块以及数据格式转换器等组成。AXI4-Stream的Valid信号控制FIFO的写使能,而Ready信号则由FIFO的满信号取反得到,输出同步模块根据FIFO的状态参数(如当前FIFO内数据个数等)、eol、sof等参数信号,读取FIFO,其功能是将video时序信号与FIFO读取出的AXl4-Stream的数据进行同步。通过Verilog语言编写的逻辑程序,数据格式转换器将输出视频信号的行场同步数据,数据有效信号等转换成VGA接口需要的RGB数据,行场同步以及VGA时钟。其中,转换出的24位RGB数据信号分别为8位的R信号,8位的G信号, 8位的B信号。不同分辨率下,VGA接口控制模块的像素时钟不同,像素时钟根据需求由可配置时钟模块产生。
图5 VGA接口控制IP核
系统硬件工程在Vivado综合完毕后,在生成PL硬件Bit流的同时,会生成一个BSP板级支持包,在PL内部通过AXl4-Lite总线与PS相连的各功能IP核的物理地址信息都包含在这个BSP板级支持包里。系统驱动软件基于BSP包内地址信息实现各IP核初始化配置,通信控制等功能。
系统软件基于Vivado自带的SDK开发平台进行设计,采用C语言编程,系统软件流程图如图6所示。首先,系统上电后,PS先启动,经过硬件平台初始化,IO输入输出接口(GPIO)初始化,摄像头参数配置,基于BSP包的各IP核配置以及VDMA配置等一系列配置操作后,PL部分的IP核开始进入正常工作模式。配置结束后,软件进入主循环,分配VDMA的读写缓冲区,分配完毕后从缓冲区中读取、处理图像,并写入DDR3相应地址。每一次循环都需要重新分配缓冲区的地址,最后将处理完毕的图像通过千兆以太网进行远传或者在显示器上进行实时显示。
图6 系统软件流程图
系统功能和性能在SnowLeo开发平台上进行测试,该开发平台大小为80 cm×60 cm,板载Zynq-7020SoC芯片,外设主要由CMOS摄像头、VGA显示器、上位机组成。上位机通过仿真器与SnowLeo平台连接,将系统软件烧写到芯片中,SnowLeo平台通过VGA接口与显示屏VGA接口相连,用于显示视频处理结果。SoC视频处理系统功能测试连接关系如图7所示,图8为系统功能的验证结果,图8(a)所示为视频图像原始信息,图8(b)为图8(a)经Sobel算子加速后得到的处理结果,可见系统功能正常,能够正确检测并清晰显示图像的边缘信息。
图7 系统测试连接关系
图8 系统功能测试结果
为了测试本文提出的视频处理系统的性能,利用Opencv在PS部分应用层软件也实现了Sobel边缘检测算法,然后对图像处理的帧率进行了比较测试。
基于Opencv的Sobel图像处理函数的API定义如下:
void sobel(char*rgb_data_in,char*rgb_data_out,int height,int width,int stride)
其中,*rgb_data_in为指向输入端某一帧帧缓存图像初始地址rgb_data_in的指针。*rgb_data_out为指向输出端某一帧帧缓存图像初始地址rgb_data_out的指针。形参中还包括height,width与stride三个参数,表示了一帧图像的高度、宽度与步长。
对于本文提出的基于PL硬件实现Sobel边缘检测,由于没有PS参与处理,因此通过示波器测量图像处理模块IP核的中断信号测试帧率。对于基于Opencv软件实现Sobel边缘检测算法,每一帧处理完毕都会产生一个中断信号,因此只需测量相邻两个中断信号之间的时间,即可计算出帧率。表1为基于PL硬件实现Sobel边缘检测和基于Opencv软件实现Sobel边缘检测两种情况下帧率的测试结果,为了提高测试精度,各测试3次,每次测20帧图像数据,然后求平均时间。测试摄像头分辨率配置成640x480,帧率为30 fps。
表1 性能测试结果对比
可见,将基于PL硬件实现Sobel边缘检测平均时间换算成帧率,仍为摄像头的帧率,这是因为硬件中,窗口数据的处理为实时的流处理,只要满足时序约束,图像处理的帧率即和摄像头输入帧率保持一致。而基于Opencv软件实现Sobel边缘检测由于采取的是纯软件串行处理的模式,帧率只有摄像头输入帧率的1/15倍,可见本文提出的系统视频图像信息处理的快速性和实时性较好。
本文基于Xilinx公司高性能Zynq-7000 SoC芯片,提出了一种小型集成化通用视频采集处理系统设计方法,利用HLS工具将图像预处理算法快速打包生成IP核,在PL中实现了图像预处理算法的硬件加速,与传统设计方案相比,视频图像处理的快速性和实时性得到了极大提高,而且满足了视频处理设备小型化、集成化、低功耗发展需求,通过设计实例验证了系统的有效性。本设计采用的基于可编程SoC视频图像处理技术,将会是未来视频图像处理技术的发展方向,在智能武器装备,工业自动化生产等军民领域具有广阔的应用前景。