基于FPGA的视频缩放设计与实现
来源:用户上传
作者:
摘要:利用Altera公司CycloneⅢ系列的FPGA作为主控芯片,通过VHDL语言编程,设计实现了一个实时的视频缩放系统。本文将双线性插值算法分解成两个一维插值算法,先实现行方向的插值,再实现列方向的插值,大大简化了FPGA实现视频缩放的处理过程。实验结果表明,处理后图像无明显锯齿现象,达到了预期效果。
关键词:图像缩放;双线性插值;FPGA
中图分类号:TP391.41 文献标识码:A 文章编号:1007-9416(2019)11-0118-02
0 引言
实时视频处理是图像处理领域的研究热点之一,广泛应用于可视电话、视频会议,监控、通信等领域中。图像缩放又是图像处理的一个基本问题,随着显示器分辨率的提高,原有的视频源需要采用视频缩放的方法才可以在不同的显示器中逐点显示。本文基于FPGA实现了一个实时视频处理系统。FPGA的优点在于其灵活的可编程性和强大的并行处理能力,可以把很多图像处理功能集成在一个FPGA芯片上,这里主要阐述基于FPGA的视频缩放的实现。缩放采用的几何变换是双线性内插法。
1 系统整体设计
本系统的硬件需求如:FPGA型号为EP3C55F484,A/D芯片TVP5150,D/A芯片ADV7123和ADV7171,两块16bit数据线的SRAM。系统板如图1所示。
1.1 信号采集
在系统前端,先利用摄像头取得光学图像。摄像头的输出为一路PAL制复合视频信号,完成光信号到模拟电信号的转变。之后通过TVP5150视频解码芯片将模拟信号转变为数字信号。利用FPGA对TVP5150进行I2C配置,选择输出格式为ITU-RBT.656,即时钟频率为27mhz的4:2:2取样格式的YCrCb信号。
1.2 场解码
一帧完整的PAL制式ITU-RBT656数据分为奇偶两场,23-311行为偶数场有效数据,366-624行为奇数场有效数据,其余为行场控制信号或无效数据。每行前288byte为行控制信号,其中最前面的4byte为EAV (有效视频结束)信号,最后面的4byte是SAV(有效视频起始)信号[1]。
EAV信号和SAV信号均有3byte的前导:FF,00,00。最后1byte为XY。F为奇偶标志位,V为垂直消隐标志位,H为水平消隐标志位,P3,P2,P1,P0为保护比特位。首先通过连续判断FF,00,00和XY来进行F、V、H的提取与检测。若H为0,即为SAV,再去判断F,若F为0,即为奇数场,若F为1,即为偶数场。每当F从1跳变到0,则为一帧的帧头。之后去判断V,若V为0,则为场正程。由于我们只处理有效数据,所以在检测到帧头的情況下,若H=0且V=0,则此行为有效数据。
1.3 帧缓存
因为ITU-RBT.656是隔行数据,需要利用两块SRAM进行乒乓存储实现逐行与隔行之间的转换。在本实验的设计中,将以一帧数据为单位进行存储。当向SRAM1中写当前帧时,读的是SRAM2中存储的前一帧,当SRAM1中存好一帧后,才会进行乒乓切换,读取SRAM1中的数据。
一帧中的有效数据为720×576个像素,开始时写地址指针位于(0,78),当检测到帧头且H=0、V=0后,第一行有效数据的SAV中的FF、00会写入(0,78),随后的00、XY会写入(0,79),随后的第一个有效像素会被写入(0,80),第一行的最后一个像素写入(0,719)。由于需要逐行变隔行,而进来的下一行数据依旧为奇数场,所以写地址的指针跳转到(2,78),然后重复第一行的存储方式。存储时,若发现SAV中的F从0跳变到1时,意味着奇数场结束,进来的将是偶数场的数据,写地址指针将跳到(1,78),进行偶数场的存储。当F从1跳变到0,即为新的一帧帧头,写地址指针会重新位于(0,78),如此循环,周而复始[2]。
2 双线性插值的图像缩放在FPGA上实现
2.1 双线性内插法
双线性插值是利用图像像素点周围四个点的相关性,即目标坐标的像素值f(i+u,j+v)是由原图像中四个坐标分别为(i,j),(i+1,j),(i,j+1)和(i+1,j+1)的像素值决定。公式为:f(i+u,j+v)=(1-u)(1-v)f(i,j)+(1-u)vf(i,j+1)+u(1-
这是一个二维算法,既要考虑图像行的信息又要考虑列的信息。本文为了FPGA编程实现的简单,把二维插值算法分解为两个一维插值算法:
(1)先进行行方向上的插值:
在数据存入时实现行插值算法,然后数据存入RAM中,在数据读出时实现列插值算法,从而大大简化了FPGA实现双线性插值的过程。
2.2 缩放算法在FPGA上实现
基于FPGA实现图像缩放时,无论是逆向映射方式还是顺向映射方式。控制模块的设计都比较复杂。为了发挥FPGA的优势,降低设计难度。本文把图像缩放过程设计为一个单元体的循环过程。在单元体内部,可以事先计算出缩放的比例系数。例如,把每行720个像素.放大到768个像素,相当于每输入15个像素,输出16个像素。此时可以把15个像素作为一个单元体.事先计算出每个输入像素周期的系数,在FPGA中设计一个包含15种情况的状态机即可。各种图像缩放倍率情况下,相应个数的输入像素都可以作为一个合适的单元体[3]。
3 实验结果
通过以上步骤,完成了各个系统模块的设计,实现了摄像头采集视频的实时缩放显示,结果如图2、3、4所示。
4 结语
本文实现了基于FPGA的视频缩放系统,整个系统分为场解码模块、4:2:2到4:4:4模块、帧缓存(乒乓存储)模块和缩放插值模块,通过将二维双线性插值分解成两次一维插值,大大简化了FPGA的设计过程。实验结果表明了本方法的可行性。
参考文献
[1] 张虎军.基于FPGA的视频采集输出系统的实现[D].大连海事大学,2011.
[2] 俞彬杰.基于FPGA的全彩色LED同步显示屏控制系统的设计[D].上海交通大学,2008.
[3] 林媛.图像缩放算法研究及其FPGA实现[D].厦门大学,2006.
转载注明来源:https://www.xzbu.com/8/view-15115700.htm