基于Sobel算子的实时视频处理系统设计与FPGA实现
2022-02-17朱高锋
朱高锋
(重庆交通大学 机电与车辆工程学院,重庆,400074)
0 引言
得益于近年计算机视觉与底层硬件电路的飞速发展,实时视频处理与加速在通信系统、医疗成像乃至安全防护领域[1]都有重要作用。
图像边沿检测算法可以提取到图像中像素发生明显变化的像素点,即视觉图像中的边缘,是实时视频处理发展中必不可少的一环。由于视频分辨率的不断提高,(常规分辨率数据量),传统边沿提取算法在嵌入式软件中的表现一直不佳,其实时性与功耗一直难以满足要求[2-4],丢帧现象也时有发生。
FPGA作为可并行处理数据、硬件资源丰富的可重构系统,其特点可完美契合实时视频处理需求[5],将视频传输数据以数据流的形式传递与计算,并能根据图像处理算法的变化重构硬件系统,是未来图像处理的主流平台之一。
本文采用OV5640摄像头采集视频数据,Xinlinx公司的Kintex 7系列FPGA芯片XC7K325T作为主控芯片,在Vivado2019.2上通过Verilog编写实现了视频图像接收与格式转换、图像预处理、视频数据缓存控制以及HDMI驱动显示等功能。经测试,该系统可完成1280×720分辨率、30fps的图像采集、预处理及显示,实现了一种基于SOBEL算子的实时视频采集与显示系统设计。
1 系统整体逻辑方案设计
本系统采用Xinlinx公司的XC7K325T芯片作为开发平台,作为Xinlinx厂家7系列FPGA芯片,Kintex系列与Spartan、Artix以及Virtex系列相比具有最佳的性价比。同时,作为28纳米制程芯片,XC7K325T基于6输入查找表,具有200万逻辑单元容量,支持高达1866Mb/s的DDR3接口,25×18的乘法器、48位累加器以及预加法器的DSP片,提供了多种硬核IP等特性都十分适合视频实时处理领域应用。外部搭载了DDR3 SDRAM大容量高速缓存芯片、HDMI接口、用于固化程序的FLASH等硬件用于实现系统功能。
系统采用自顶而下的模块化设计方法,将FPGA内部逻辑划分为系统初始化、图像预处理模块、数据交互三大模块。其中,系统初始化模块作用为完成对OV5640摄像头的初始化,包含I2C通信模块、寄存器初值存储模块、配置延迟模块;图像预处理模块负责完成视频图像的预处理操作,包括RGB888转Ycbcr模块、中值滤波模块、Sobel边缘提取模块、开操作模块;数据交互模块负责FPGA与外部数据交互,包括摄像头接收模块、视频数据缓存模块、HDMI驱动模块。
系统整体逻辑方案如图1所示。首先由摄像头初始化模块通过I2C接口对OV5640进行配置,主要参数配置为:分辨率1280×720、帧率30fps、输出图像格式RGB565、输出接口DVP、输出时钟PCLK42MHz;通过图像接收模块对视频进行接收的同时将图像视频格式转换为RGB888输入图像预处理模块;在预处理模块中,首先将RGB888转为对边缘提取有益的Ycbcr格式,并经过中值滤波初步滤除图像噪点,然后经过SOBEL算子与先腐蚀后膨胀操作完成视频数据预处理操作;视频数据缓存控制模块将预处理后的视频数据缓存入DDR3 SDRAM外部存储器中,该模块调用了MIG核进行片外DDR3读写控制,读出的视频缓存数据后经由HDMI驱动模块输出至显示屏观察系统设计效果。
图1 系统逻辑框图
2 FPGA片内逻辑设计
2.1 摄像头配置模块
本设计采用OV5640高清摄像头,设置输入时钟XCLK频率为24M,通过I2C接口赋值寄存器设置相关参数,I2C时钟速率设置为400K。
本文系统中,分辨率为1280×720,帧率设置为30fps,其中帧率由总水平输出宽度HTS、总竖直输出宽度VTS和输出时钟PCLK频率共同决定。
摄像头输出接口设置为DVP接口,则摄像头输出分辨率为DVP输出水平与竖直宽度,在配置文件中,摄像头寄存器0X3808内数据bit[3:0]与0X3809内数据bit[7:0]拼接控制DVP接口输出水平宽度,DVP水平输出为1280,即0X3808配置为05、0X3809配置为00。类似地,DVP输出竖直宽度为720,即0X380A配置为02,0X380B配置为D0。
0X3035、0X3036、0X3037、0X3108等多个寄存器经过倍频与分频操作得到输出时钟PCLK,本文PCLK配置为42MHz,并通过配置0X380C与0X380D设置HTS与VTS分别为1892、740。则摄像头输出帧率F为:
2.2 摄像头数据接收模块
摄像头输出接口配置为DVP接口,输出格式为RGB565,即一格图像的数据位宽为16位。DVP时序图如图2所示。
图2 DVP时序图
图中,VSYNS为帧同步有效信号,两个VSYNS高电平信号中间输出一帧图像的数据,而HREF为行同步有效信号,当HREF信号为高,接口输出一行图像的数据。
DVP接口的数据宽度为8位,所以当HREF信号为高时,需两个PCLK输出数据拼接为一位图像数据,在拼接接收到的视频数据的同时,将数据RGB三个通道对应的5、6、5位数据高位填0填充至8位,再将其拼接转化为RGB888格式。
2.3 RGB888转Ycbcr模块
Ycbcr作为图像色彩空间的一种格式,常用于图像系统的编解码中,其中Y分量代表了一格图像的亮度成分。对于图像来说,颜色的亮度分量在图像边缘处常常发生突变,更易于提取边缘[6]。同时,通过将彩色视频数据通过转为Ycbcr格式,提取其中Y分量进行后续的处理,可减少图像的数据处理量。RGB888转换至Ycbcr公式如下:
为避免小数计算,节省FPGA内部逻辑资源,将RGB三个系数常量左移8位并量化为整数,在计算后右移8位恢复量级,并将公式中的运算分为乘积、求和、移位三级流水线以提升运算速率,同时对相应行、场同步信号做同步延迟。
2.4 中值滤波模块
源于排序基础理论的中值滤波法是非线性滤波方式中抑制噪声的有效方法之一,在能有效滤除常见的椒盐噪声或脉冲噪声的同时可以保证图像信息的完整性。本文采用中值滤波是因为该方法即不会造成图像边缘模糊,在保留了对常规图像滤波效果的同时易于硬件加速实现。中值滤波的原理是采用一个邻域中的中值来替换该邻域内其他值,其公式为:
其中,f(x,y)为图像像素点的像素值,g(x,y)为中值滤波后的图像像素值,W为待滤波的图像模板。本文采用3×3的矩阵模板,即将临近的像素点组成3×3的矩阵,并通过排序得出模板中的中值,最后将模板中的其他像素值替换为中值。
在FPGA内部逻辑实现过程中,充分利用FPGA的并行能力,通过三级流水线进行实现:
(1)将三行数据分别进行排序,得到每行数据的最大值、中间值、最小值;
(2)分别对三行数据的最大、最小与中间值进行同时比较;
(3)将三个最大值比较得到的最小值、三个中间值得到的中间值以及三个最小值比较得到的最大值进行比较,得到最后的中值。
2.5 SOBEL运算模块
在本模块中,将得到的灰度图像采用3*3的Sobel算子进行水平方向与竖直方向的同步边缘检测。
Sobel算法第一步需采用水平算子与竖直算子与视频每帧图像进行卷积运算,其中的Sobel算法的水平算子Sobelx与竖直算子Sobely如式(4)、(5)所示:
对一帧图像进行3*3的卷积运算需缓存前两行的数据。本设计采用了Shiftram IP核对前两行数据进行缓存,因为Xinlinx的ShiftramIP核最大深度为1088,采用深度为1024与256的两个IP核共同缓存一行数据。
第二步需计算图像的梯度向量G,G等于Sobel算子在两个方向得到的卷积值Gx与Gy的平方根,即:
其中,开方采用CORDIC核进行运算,其延迟为6个时钟周期。
第三步将得到的梯度值G与阈值比较,大于阈值则判定为边缘,小于阈值则相反。将输出的图像数据值进行翻转,即让检测到的图像边缘显示为白色,非边缘显示为黑色。
本文系统中采用双按键来控制Sobel阈值的加减,可使图像输出调整至最佳效果。
2.6 开操作运算模块
由于SOBEL运算结果存在检测边缘过厚[7-8]的问题,对处理后的边缘数据进行开操作,即先腐蚀后膨胀。开操作可以消除图像中的细小噪点,并能平滑边缘轮廓。腐蚀与膨胀运算与中值滤波类似,同样采用3*3的腐蚀矩阵与膨胀矩阵模板对每帧图像进行运算,若图像数据生成的3*3矩阵模板为:
则对应的腐蚀输出Geros与膨胀输出Gexpa分别为:
将得到的输出Geros与Gexpa替代该模板中的其他像素值,就得到了输出图像。
2.7 视频缓存控制模块
本模块采用DDR3存储控制器MIG的IP核辅助完成数据缓存设计。作为整个系统中的时钟域数据交互模块,MIG核两侧分别采用两个FIFO分别用于MIG的读写数据缓存以及数据的跨时钟域操作。MIG核输入差分时钟频率为200MHz,两侧时钟比例设置为4:1。
FPGA内部逻辑通过控制读写使能信号app_en、app_wdf_wren,以及观测是否可以进行读写的准备信号app_rdy、app_wdf_wren进行读写操作,并化用乒乓操作思想,通过地址总线与BANK地址来进行视频数据存储位置切换,提升了实际带宽,避免了视频图像拖影现象的产生。
2.8 HDMI驱动模块
本系统采用了常规HDMI驱动芯片Sil9134作为显示桥接芯片,通过产生1280×720的VGA时序读取读FIFO内的视频采集数据,并通过Sil9134芯片转换为HDMI接口输送至显示屏显示。其中1280×720的VGA时序图见2,通过计数器产生VSYNC信号和HREF信号,其计数时序表如表1所示。
表1 VGA时序表
表1中,当计数器在SYNC范围内,将VSYNC、HREF信号置为高电平。而当计数器处于DISP范围内时,将行、列有效信号置为高电平,数据有效信号DE在行、列信号同时为高时置为高电平。
3 版级调试与验证
将代码下载至开发板进行版级测试,初始阈值设置为23,测试图如图3所示。
图3 测试原图
采用中值滤波与Sobel算子结果如图4所示,图像边缘提取过厚,且在边缘提取后有细小噪点产生。
图4 Sobel提取结果
加上腐蚀算法后结果如图5所示,可以看到,腐蚀操作消除了Sobel提取后的船体体内与桅杆周围的噪点,并削弱了检测边缘厚度,但将船帆的左上边缘、船体下部阴影边缘以及船体右侧细小边缘隔断或滤除。
图5 Sobel与腐蚀提取结果
加上膨胀算法后结果为图6所示,膨胀操作将腐蚀操作细化的边缘进行增强,并平滑了船体的边缘轮廓。
图6 Sobel与开操作提取结果
实验结果显示,本文设计系统可以较好的完成预期功能,图像主要边缘提取效果好,图像噪声较低。
4 结论
本文采用Xinlinx公司Kintex-7系列FPGA的XC7K325T芯片与0V5640高清摄像头完成了基于Sobel算子的实时图像采集与显示系统设计,并通过版级调试测试了预处理算法各模块的处理效果,验证了系统工作正确性,为要求更高、算法更为复杂的实时视频处理系统设计提供了参考。