《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 设计应用 > 视频缩放在FPGA中的应用和实现
视频缩放在FPGA中的应用和实现
2016年电子技术应用第6期
张 梁,王景存,梅 镖
武汉科技大学 信息科学与工程学院,湖北 武汉430081
摘要: 针对某显示系统中监控视频控制器的实际需求,设计了一种可实现四路视频信号实时缩放的电路架构。通过权衡几种常用图像缩放算法的显示质量和硬件可行性,选择用双线性插值算法实现视频的缩放,并在FPGA平台上以双口RAM资源构建的线缓存作为算法硬件实现,该算法主要由视频数据缓冲模块、插值系数产生模块以及整体控制模块构成。本设计在满足视频缩放质量要求的基础上,避免了采用过于复杂算法而消耗过多的FPGA资源,有效地解决了视频缩放时原始图像信息量丢失导致图像失真的问题。结果表明,该设计能够实现任意比例的视频缩放,实时性高,应用灵活,缩放后显示效果良好,能够满足实际工程的要求。
中图分类号: TM930.9
文献标识码: A
DOI:10.16157/j.issn.0258-7998.2016.06.009
中文引用格式: 张梁,王景存,梅镖. 视频缩放在FPGA中的应用和实现[J].电子技术应用,2016,42(6):34-37.
英文引用格式: Zhang Liang,Wang Jingcun,Mei Biao. Application and implementation of video scaling algorithm based on FPGA[J].Application of Electronic Technique,2016,42(6):34-37.
Application and implementation of video scaling algorithm based on FPGA
Zhang Liang,Wang Jingcun,Mei Biao
College of Information Science and Engineering,Wuhan University of Science and Technology,Wuhan 430081,China
Abstract: Focusing on the practical requirements of the monitoring video controller in some displaying systems, this paper introduces a circuit architecture which is designed for real time scale of four video signals. Through analyzing the display quality and hardware realizability of several scaling algorithms, selects implement video scaling by bilinear interpolation algorithm and uses line buffers architecture as the core of algorithms implementation based on FPGA. The design mainly consists of the data buffer module, the coefficient generation module and the integrated control module. To meet the quality requirements of video scaling, this design avoids selecting complex algorithms to cause FPGA resources to be consumed excessively, and effectively solves the problem of image distortion caused by the loss of the original image information. The result indicates that the system can realize arbitrary scaling, and its real-time,flexibility and display effect are good, which can meet the application requirements of the actual project.
Key words : video scaling;bilinear interpolation;line buffer;FPGA

0 引言

    随着数字多媒体技术的不断发展,数字图像处理技术广泛应用于空间探测、生物医学、监控系统以及工业检测等许多领域中。数字视频处理则是基于对视频中每帧图像的处理来实现的。数字视频图像的缩放是视频处理中的一个重要组成部分。

    目前视频缩放系统大多采用视频缩放的专业芯片设计,应用单一、灵活性差且成本较高[1]。本设计是在FPGA的平台上,利用双口RAM资源构建两个线缓存,在视频图像的垂直和水平两个方向上依次进行实时双线性插值运算,实现视频图像的任意比例缩放,具有实时性好、处理速度快、应用灵活等特点。

1 缩放算法的硬件可行性

1.1 缩放算法的选取

    目前,图像缩放算法大致可以分为两大类[2],一类是基于边缘的图像缩放算法,它利用了图像的边缘信息,能够很好地还原原始图像,但该算法计算复杂,运算速度慢,硬件上难以实现;另一类是基于插值的图像缩放算法,它的算法实现相对简单,但缩放后可能会产生细节丢失、轮廓模糊等现象。其中,不同的插值算法有不同的精度,插值算法的好坏也直接影响着图像的失真程度。最常用的插值算法有3种:最近邻插值、双线性插值、立方卷积插值,使用立方卷积插值达到的效果是最佳的。考虑到最终算法需要在FPGA上完成,算法的复杂度直接影响FPGA内部的逻辑资源和存储块的消耗量,以及处理每个实时像素值所消耗的时钟周期,本设计选用双线性插值来完成视频图像的缩放。

1.2 双线性插值算法的原理

    双线性插值,又称为双线性内插。在数学上,双线性插值是由两个变量插值函数的线性插值扩展,利用了需要处理的原始图像像素点周围4个像素点的相关性,通过双线性算法计算而得出[3]

    若用(x,y)表示期望位置,用Q(x,y)表示期望输出的像素值,I(x,y)表示输入像素值,与位置(x,y)相邻的4个点为(x1,y1)、(x1,y2)、(x2,y1)、(x2,y2),如图1所示。先在x方向上进行线性插值,得到:

    wdz1-gs1-2.gif

wdz1-t1.gif

式中:I(R1)和I(R2)是4个像素值中两两在水平方向上的插值结果。

    再对式(1)和式(2)得到的两个在水平方向上的插值结果进行垂直方向上的插值

    wdz1-gs3-4.gif

    这样Q(x,y)就是期望位置所要的像素值,双线性插值法计算量大,但缩放后的图像质量高,由于双线性插值具有低通滤波器的性质,使高频信号受损,可能会使图像在轮廓上有一定的模糊。

    考虑到FPGA内部丰富的存储块,设计将视频数据以行为单位交替写入两个由双口RAM构成的线缓存中,通过缩放比例合理控制读写地址,先进行相邻4个像素的垂直线性插值,然后对得到的两个结果进行水平方向插值。

2 FPGA实现

2.1 功能模块的划分

    FPGA选用的是ALTERA公司的Cyclone IV系列EP4CE30F23C6,共有28 848个Les,66个M9K,132个9位乘法器,完全满足设计需要。整个系统主要由视频数据的采集、剪切、旋转、基于ddr2的数据缓冲、缩放、拼接以及视频的输出构成。整个监控系统的实现框图如图2所示。

wdz1-t2.gif

    监控系统是将4个装载在特定位置的170°广角摄像头采集的实时图像进行翻转、剪切、缩放、拼接成一幅实时的监控画面。4个模拟摄像头采集的PAL复合视频信号经TW2867采样输出为108 M的4路复用总线的数字信号BT.656,在FPGA中根据每个视频不同的ID号分解出4路后,经过适当的剪裁,将奇偶场交叉存储在ddr2的4个物理区域,实现视频的去隔行功能,得到逐行排列的视频流,便于后续模块的处理。其中左摄像头采集的视频需要顺时针旋转90°、右摄像头采集的视频需要逆时针旋转90°,实现的方法是把一帧图像分解为若干小块,以块为单位,从ddr2中突发读出旋转前的视频数据,进行旋转排列,然后再以块为单位突发写入ddr2的另外一块区域,直至整帧图像处理完毕。存储在外部Flash中的图片菜单等资源会在上电完成后自动写入ddr2的某一区域,供后续模块调用。

    输出时,从对应的ddr2区域中读出视频数据,存入线缓存后经过双线性插值缩放模块,与ddr2中读出的图片菜单拼接成一幅实时监控画面。考虑到后续ADV7171的输入是BT.656格式的视频数据,前面存储到ddr2时已通过帧存机制实现了去隔行功能,这里需将处理后的逐行视频流隔行处理[4],为后续转换做好准备。具体做法是以27 M(位宽16 bit)的速率从拼接模块中读取数据,每帧图像取出所有奇数行(或者所有偶数行),下一帧图像取出所有偶数行(或者所有奇数行),交替进行,将取出的奇偶行以27 M(位宽8 bit)的速率给输出模块,输出模块将奇偶场的YUV422有效视频数据加上必要的消隐组成标准的BT.656格式视频数据,经ADV7171编码成复合视频输出至显示屏。 

    由于篇幅有限,本文只对整体架构流程粗略介绍,下文将着重对缩放算法的实现过程进行描述。

2.2 缩放算法的硬件实现

    双线性插值缩放算法硬件实现总体框图如图3所示,该设计主要包括3大部分,分别为数据缓冲、系数与像素值的计算以及整体控制。

wdz1-t3.gif

2.2.1 数据缓冲

    缩放模块与ddr2之间采用FIFO的数据交互方式。由于该算法至少需要两行数据才能进行运算,因此首先将输入的视频数据进行缓存,且需缓存两行视频数据。设计采用两个线缓存来缓存两行数据,每个线缓存由3个双口RAM组成,由于输入的数据是YUV422格式的,所以第一个双口RAM存储Y分量,每行有720 B,深度为1 024;第二个和第三个双口RAM交替存储UV分量,U和V都是360 B,故深度选为512。设计中采用两个状态机分别控制数据流入和流出线缓存,始终保证一个线缓存中有一行完整的数据,另一个线缓存的写地址大于读地址,确保将要处理的像素值提前写入线缓存。

    从线缓存读数据时,每个像素值由3个双口RAM的输出拼接,也就是UV分量的同一值会被读取两次,实现了YUV422到YUV444的转换,方便后续模块的处理。

2.2.2 插值系数的产生

    在进行缩放计算时,首先需要确定期望输出的视频分辨率,通过原始输入和期望输出的分辨率确定缩放的比例,如下式所示:

    wdz1-gs5.gif

    式中,xscaler是水平方向缩放比例,yscaler是垂直方向缩放比例,t_width和t_heigth分别表示期望输出图像的水平和垂直方向上的像素点个数;s_width和s_height分别表示原始输入图像的水平和垂直方向上的像素点个数。

    假设待插值点在缩放后的图像中的坐标为(m,n),双线性插值算法的计算公式如下:

     wdz1-gs6.gif

wdz1-t4.gif    式中,a、b、c、d分别相邻4个像素点(左上、右上、左下、右下)的像素值。由于FPGA无法处理浮点数,故在代码中需将水平和垂直缩放比例乘以256倍,最终得到的y需要向右移位8位,即为插值的期望像素值。

2.2.3 整体控制

    缩放算法的整体控制流程如图4所示,由于缩放模块的前后数据流是跨时钟域的,设计采用FIFO进行交互,确保两端的FIFO不会超过设定的阈值即可保证数据的正常传输。两个线缓存具有相同的读写地址,对其进行写操作时利用片选信号,实现两个线缓存的乒乓操作,可以保证读取到的视频数据为同一行的数据[5]

    当线缓存的写地址至少领先读地址10个单位时,后续模块会读取线缓存中的值并计算,在读的过程中会实现坐标的转换。比如原始图像一行是720个像素值,期望输出的图像一行是800个像素点,每读取一个数据,读取地址累加一次,当每读完9个数据时,地址不变,重复读取第9个数据,这样就实现了列坐标的转换。行坐标的转换类似,比如期望输出的行数少于原始图像的行数,根据缩小的比例,读线缓存的使能信号会失能直到前置FIFO中的新一行的数据覆盖掉线缓存中未被处理的一行数据,实现了行坐标的变换。

    由于一个时钟无法完成过多的计算,且水平插值需要垂直插值的结果参与运算,故采用流水线操作将公式分解为3步,如式(6)所示,每一步的计算过程完全一样,设计中做成通用模块,只需修改对应的参数,实例化即可。插值计算功能框图如图5所示,其中a,b是像素值输入端口,如果是垂直插值模块,指的是两个线缓存的上下值;如果是水平插值,指的是垂直插值处理后相邻的两个输出值。a_coff和b_coff分别是插值系数,呈取反关系。scale_en_in是使能信号,c是处理后的输出值。

wdz1-t5.gif

3 仿真与验证

    本设计的解码芯片为TW2867,编码芯片为ADV7171,存储器DDR2的型号是MT47H64M16,共两片。在Quartus12.1开发平台上使用Verilog HDL对各逻辑模块进行设计。

    经验证得到本缩放模块占用FPGA内部主要逻辑资源情况如表1所示,其中Dedicated Logic指的是逻辑单元中实现寄存器,即时序逻辑所占的部分。

wdz1-b1.gif

    图6为通过Quartus自带的仿真工具SignalTap对分辨率为720×576的视频放大为800×600进行仿真得到的双线性插值缩放算法的仿真图。图中, rdaddress是线缓存的读地址,scale_col是期望输出的行像素个数,可以看到在每9个像素中,读地址会在最后一个像素处保持不变。rd_not_read_data为低电平时,线缓存的写入和读取是同时进行的,wraddress是线缓存的写地址,始终大于rdaddress。上面五行a、b、a_coff、b_coff、c分别对应垂直插值的纵向像素值、插值系数及输出,下面五行对应水平插值的各参数。 

wdz1-t6.gif

    图7为拍摄的实物效果图,图7(a)是将4路摄像头采集的实时图像分别压缩,水平方向和垂直方向各缩小一半后拼接而成。图7(b)是将第二路摄像头采集的图像显示出来,没经过缩放。由于摄像头采用的是170°广角摄像头,图像4角的黑色是正常现象。通过效果图可知,本设计方案测试效果良好,适合于实时监控系统的图像采集。

wdz1-t7.gif

参考文献

[1] 赵艳军,何其锐,施锡涛.基于DVI和FPGA的视频叠加器设计[J].电子技术应用,2011,37(6):31-35.

[2] 张俊华,陈建华,王逍,等.基于边缘移动匹配法的图像插值[J].计算机工程与应用,2003,39(6):73-75,134.

[3] Donald Hearn,等.计算机图形学.蔡士杰等译[M].北京:电子工业出版社,2007.

[4] 韩彬,于潇宇,张雷鸣.FPGA设计技巧与案例开发详解[M].北京:电子工业出版社,2014.

[5] 陈全兵,习友宝.基于双线性内插算法的多路视频缩放设计[J].电视技术,2015,39(1):43-46.

此内容为AET网站原创,未经授权禁止转载。