一种实时视频缩放的硬件电路及其缩放方法

文档序号:1759077 发布日期:2019-11-29 浏览:22次 >En<

阅读说明:本技术 一种实时视频缩放的硬件电路及其缩放方法 (A kind of hardware circuit and its Zoom method of real-time video scaling ) 是由 杜高明 范涛 王家舜 于 2019-09-04 设计创作,主要内容包括:本发明公开了一种实时视频缩放的硬件电路及其缩放方法,该硬件电路包括:复位编码模块、水平预缩放模块、垂直缩放模块和复位解码模块;复位编码模块对摄像头输入的像素点进行编码;水平预缩放模块在对像素点进行水平方向上的预缩放;垂直缩放模块对预缩放的像素点进行垂直方向上的缩放;复位编码模块对垂直缩放后的像素点进行解码,恢复到摄像头输入的编码格式。本发明能绕开存储设备的读取/写入时间造成的性能瓶颈,从而提升视频缩放的处理速度、减少存储资源的面积开销,以达到实时同步处理。(The invention discloses the hardware circuit and its Zoom method of a kind of real-time video scaling, which includes: to reset coding module, horizontal pre- Zoom module, vertically scale module and reset decoder module;The pixel that coding module inputs camera is resetted to encode;Horizontal pre- Zoom module is carrying out the pre- scaling in horizontal direction to pixel;Vertically scale module carries out the scaling in vertical direction to the pixel scaled in advance;It resets coding module to be decoded the pixel after vertically scale, is restored to the coded format of camera input.Performance bottleneck caused by the read/write time that the present invention can get around storage equipment, thus the area overhead for promoting the processing speed of video scaling, reducing storage resource, to reach real-time synchronization processing.)

一种实时视频缩放的硬件电路及其缩放方法

技术领域

本发明属于信息技术中的文本处理领域,具体的说是一种实时视频缩放的硬件电路及其缩放方法。

背景技术

视频缩放技术作为数字图像处理技术中的关键技术,在电脑端上安装图像处理软件的方法来完成图像的缩放处理操作,通过较长的耗时换取了较好的图像缩放质量,是传统的视频图像处理系统采用的方式;但是在实际应用中,需要系统的硬件资源具备并行处理图像信息的能力,从而达到实时处理的效果,所以普通电脑无法实现数据的快速进出,进而不能适用于实时系统;若要具备实时处理的能力,就需要有具备并行处理图像信息能力的硬件平台。

传统的图像缩放软件处理时间较长,无法实现实时缩放,目前基于FPGA实现图像缩放较为流行,大部分基于FPGA实现视频缩放的思路沿袭软件的处理思路,先将一帧数据存储在RAM/DDR中,再载入需要的图像数据进行处理,处理速度增益由硬件资源本身的处理高速性实现,虽然能实现实时缩放,但在缩放前后会有帧率下降的情况,对于高倍数的放大无法达到实时处理的理想的帧率。

发明内容

本发明是为了解决上述现有技术存在的不足之处,提出一种实时视频缩放的硬件电路及其缩放方法,以期能绕开存储设备的读取/写入时间造成的性能瓶颈、减少存储资源的面积开销,从而提升视频缩放的处理速度,并达到实时同步处理。

本发明为解决技术问题采用如下技术方案:

本发明一种实时视频缩放的硬件电路的特点由复位编码模块、水平预缩放模块、垂直缩放模块和复位解码模块组成;

所述水平预缩放模块由异步FIFO_1、ROM_1组、寄存器单元、水平运算单元和水平负反馈电路组成;

所述垂直缩放模块由异步FIFO_2、ROM_2组、BRAM组、垂直运算单元和垂直负反馈电路组成;

假设当前一帧原始图像的分辨率为o_width×o_length,缩放后的图像分辨率为a_width×a_length;

所述复位编码模块在摄像头输入时钟频率下获取当前第k行的第i个像素点,并对当前第k行的第i个像素点的最高位进行扩展,将所扩展出的最高位作为标志位,将其余位作为数据位;再根据摄像头所传递的帧使能信号判断当前第k行的第i个像素点是否为一帧图像的第一行的第一个像素点,若是,则将所述标志位置为“1”,否则,将标志位置为“0”;从而得到编码后的第k行的第i个像素点;

所述ROM_1组是根据行偏移量作为存储地址并存储有行插值系数;假设编码后的第k行的第i个像素点经过水平预缩放模块后得到预缩放后的第k行的第j个像素点,所述预缩放后的第k行的第j个像素点映射在水平预缩放前的图像上为第k行的第s个像素点,其中,s=j×(o_width/a_width),则所述行偏移量为s的小数部分,s的整数部分记为c;

所述异步FIFO_1按照摄像头输入时钟频率从第k行的第i个编码后的像素点开始依次写入第k行的各个编码后的像素点直到达到水平预存值r时,所述异步FIFO_1再将第k行的第i个编码后的像素点传递给所述寄存器单元,直到所述寄存器单元所接收的像素点个数为n时,表示所述寄存器单元存储完毕,从而开始计算预缩放后的第k行的第j个预缩放后的像素点;

所述水平运算单元从所述寄存器单元中获取第k行的n个编码后的像素点,再根据所述第k行的第j个预缩放后的像素点的偏移量从所述ROM_1组读取相应的n个插值系数并按照流水线的方式进行插值计算,从而得到预插值数据并作为第k行的第j个预缩放后的像素点,判断c*=c+2是否成立,若成立,则令第k行的第j个预缩放后的像素点的预缩放使能信号为0,否则为1;;

当第k行的第j个预缩放后的像素点计算完毕,所述异步FIFO_1输出empty输出信号给所述水平负反馈电路,所述水平负反馈电路根据所述empty输出信号产生反馈信号;

若所述反馈信号有效,则所述寄存器单元中所存储的第k行的n个编码后的像素点保持不变,i不加1;若所述反馈信号无效,则对所述寄存器单元中所存储的第k行的n个编码后的像素点进行更新判断,假设预缩放后的第k行的第j+1个像素点映射在水平预缩放前的图像上为第k行的第s*个像素点,c*为s*的整数部分,若c*=c,则保持i不变,并利用寄存器单元中所存储的第k行的n个编码后的像素点计算第k行的第j+1个预缩放后的像素点,若c*≠c,则所述将i加1后,使得所述寄存器单元中所存储的第k行的n个编码后的像素点进行1位的移位寄存,并得到更新后的第k行的n个编码后的像素点用于计算第k行的第j+1个预缩放后的像素点;

所述ROM_2组是根据列偏移量作为存储地址并存储有列插值系数;假设第k行的第j个预缩放后的像素点经过垂直缩放模块后得到垂直缩放后的第b行的第j个像素点,所述垂直缩放后的第b行的第j个像素点映射在垂直缩放前的图像上为第v行的第j个像素点,其中,v=b×(o_length/a_length),则所述列偏移量为为v的小数部分,v的整数部分记为d;且第v行的各个像素点的列偏移量均相同;

所述异步FIFO_2按照水平预缩放频率从第k行的第j个预缩放后的像素点开始依次写入第k行的各个预缩放后的像素点直到达到垂直预存值u时,所述异步FIFO_2再按照垂直预缩放频率将第k行的第j个预缩放后的像素点传递到BRAM组中,直到所述BRAM组所接收的像素点个数为n×a_width时,表示所述BRAM组存储完毕,从而对所存储的n×a_width个预缩放后的像素点更新判断,假设第b-1行的第j个像素点映射到缩放前的图像中为第v*行的第j个像素点,d*为v*的整数部分,若d*=d,则所述BRAM从异步FIFO_2中读取第k行中第j个预缩放后的像素点并覆盖写入到存储第k-n+1行第j个的BRAM存储区域处;若d*≠d,则所述BRAM中所存储的n×a_width个像素点保持不变;

所述垂直缩放单元从所述BRAM组中读取n行中各行的第j个预缩放后的像素点,再根据所述第b行的列偏移量从所述ROM组读取相应的n个插值系数并按照流水线的方式进行插值计算,得到插值数据并作为第b行的第j个缩放后的像素点;判断d*=d+2是否成立,若成立,则令第b行的第j个预缩放后的像素点的预缩放使能信号为0,否则为1;

所述复位解码模块按照垂直预缩放频率获取第b行的第j个缩放后的像素点,并根据其标志位产生缩放后图像的帧使能信号后,删除所述标志位,从而得到解码后的第b行的第j个像素点用于显示。

本发明一种实时视频缩放方法的特点是按如下步骤进行:

步骤1、假设当前一帧原始图像的分辨率为o_width×o_length,缩放后的图像分辨率为a_width×a_length;定义原始图像中的任意一行像素点为第k行像素点,第k行像素点中的任意一个像素点为第i个像素点;

假设预缩放前的第k行的第i个像素点经过预缩放处理后得到预缩放后的第k行的第j个像素点;

假设预缩放后的第k行的第j个像素点映射在预缩放前的图像上为第k行的第s个像素点,其中,s=j×(o_width/a_width),则令行偏移量为s的小数部分,s的整数部分记为c;

假设预缩放后的第k行的第j-1个像素点映射在预缩放前的图像上为第k行的第s*个像素点,s*的整数部分记为c*;

假设缩放后的第b行的第j个像素点映射在缩放前的图像上为第v行的第j个像素点,其中,v=b×(o_length/a_length),则令列偏移量为v的小数部分,v的整数部分记为d;且第v行的各个像素点的列偏移量均相同;

假设缩放后的第b-1行的第j个像素点映射到缩放前的图像中为第v*行的第j个像素点v*的整数部分记为d*;

步骤2、初始化k=1、b=1;

步骤3、初始化i=0;

步骤4、初始化j=0;

步骤5、将i+1赋值给i;

步骤6、对当前第k行的第i个像素点的最高位进行扩展,将所扩展出的最高位作为标志位,将其余位作为数据位;

步骤7、判断当前第k行的第i个像素点是否为一帧图像的第一行的第一个像素点,若是,则将所述标志位置为“1”,否则,将标志位置为“0”;从而得到编码后的第k行的第i个像素点,执行步骤5;

步骤8判断i≥n是否成立,若成立,则执行步骤9;否则,执行步骤5;

步骤9、将j+1的值赋给j,判断j>a_width是否成立,若不成立,执行步骤10,否则,再判断k≥n是否成立,若成立,则执行步骤15,否则,执行步骤3;

步骤10、根据第k行第i、第i-1......第i-n+1个缩放前图像点与第k行第j个缩放后的像素点的偏移量计算出第k行第j个预缩放像素点;

步骤11、判断c*=c+2是否成立,若成立,则令第k行的第j个预缩放后的像素点的预缩放使能信号为1,否则为0;

步骤12、判断k≥n是否成立,若成立,执行步骤13;否则,再判断c*=c是否成立,若c*=c成立,则执行步骤9,否则,执行步骤5;

步骤13、根据第k、第k-1......第k-n+1行中各行第j个预缩放后的像素点以及第b行第j个缩放后像素点的偏移量计算出缩放后的第b行第j个像素点;

判断14、d*=d+2是否成立,若成立,则令第b行的第j个预缩放后的像素点的预缩放使能信号为1,否则为0;

步骤15、判断j>a_width是否成立,若成立,则将b+1赋值给b后,执行步骤17,否则,b保持不变并执行步骤16;

步骤16、判断c*=c是否成立,若成立,则执行步骤9,否则,执行步骤5;

步骤17、判断b>a_length是否成立,若成立,则当前一帧原始图像处理完毕,并返回执行步骤1处理下一帧原始图像,否则,执行步骤18;

步骤18、判断d*=d是否成立,若不成立,则执行步骤3,否则,执行步骤19;

步骤19、根据第k、第k-1......第k-n+1行中各行第j个预缩放后的像素点以及第b行第j个缩放后的像素点的偏移量计算出缩放后的第b行第j个像素点;

步骤20、判断d*=d+2是否成立,若成立,则令第b行的第j个预缩放后的像素点的预缩放使能信号为1,否则为0;

步骤21、判断j>a_width是否成立,若成立,则将b+1值给b后,执行步骤17,否则,b保持不变,并将j+1的值赋给j后,执行步骤19。

与现有技术相比,本发明的有益效果在于:

1、本发明缩放电路未用大量DDR去存储一整帧图像数据,故不受存储器读取/写入一整帧图像数据的耗时限制;在电路缩放处理时,水平缩放模块用寄存器单元暂存n个像素点,垂直缩放模块用双口BRAM组暂存n行预缩放像素点,即整个电路只暂存少量数据即可进行缩放处理,存储设备的读取/写入时间不会造成整个电路的性能瓶颈;

2、本发明与西安电子科技大学发表的《视频图像缩放的FPGA设计与实现》论文中述的实时缩放架构相比有以下优势:本发明通过设计逻辑控制电路,使水平缩放模块独立运行并不能被阻塞,并用FIFO_2(约一行图像数据大小)来缓存水平预缩放模块的超前运算数据,采用两个时钟域使垂直模块比水平模块运算速度快,这样FIFO_2在堆积后会被清空,直到下一次再需要暂存水平预缩放模块的数据来到,从而将整个架构中水平预缩放和垂直缩放由西电论文中的时域上60%的并行化处理提升到时域上100%的完全并行化处理并且与西电论文中架构相比存储资源开销上减少80%;

3、本发明采用暂存少量数据处理的架构并且水平预缩放与垂直缩放实现了完全并行化后整个电路的关键耗时路径为数据缩放处理,,对数据缩放处理中的核心算法单元进行了三级流水线的处理,将乘法、移位、加法操作进行流水线切割,流水线之后该数据缩放处理的主要耗时步骤为乘法器的运算时间。经过优化关键路径后,本设计的缩放架构较西电论文中的缩放架构相比,对于同比例的缩放,已由24帧/秒的速度提高到60帧/秒的处理速度;

4、除在速度方面的优化外,本发明在插值方式采取目前插值后图像效果最好的基于双三次(立方)4×4的采样窗口;在实现构架的完全并行化时,会有多个时钟频率的精度问题与FIFO空/满问题,针对此不稳定情况设计了新的复位编码格式与负反馈电路,经过优化后的输出图像有较高的峰值信噪比;

5、本发明硬件电路设计时采用参数化的方法,可以通过改变输入、输出与相位的相关参数的配置,从而实现对任意分辨率大小的视频进行任意比例的放大或缩小;

6、本发明缩放算法在深度并行化的之后可以实时处理超高清、高速的视频,对高倍数的放大也可以达到100帧以上的帧率;

7、总体上本发明在用了较少的存储资源的前提下,通过深度的并行化提高速度,实现了对超高清、高速视频的高倍数实时缩放的处理,且图像质量良好,画质清晰。

附图说明

图1为本发明所述硬件电路的各模块的链接图;

图2为本发明水平预缩放模块示意图;

图3为本发明垂直缩放模块示意图;

图4为本发明复位编码模块采用的编码格式示意图;

图5为水平预缩放模块的预放大硬件电路示意图;

图6为水平预缩放模块的预缩小硬件电路示意图;

图7水平运算单元示意图;

图8为垂直缩放模块的放大硬件电路示意图;

图9为垂直缩放模块的缩小硬件电路示意图;

图10为垂直运算单元示意图;

图11为本发明与近年提出的各种缩放电路的最高频率的对比图;

图12为本发明与近年提出的各种缩放电路的处理帧率的对比图。

具体实施方式

本实施例中,如图1所示,一种实时视频缩放的硬件电路采用深度并行化的设计,并由复位编码模块、水平预缩放模块、垂直缩放模块和复位解码模块组成,其中,复位编码模块接收摄像头输入像素点,并输出编码后的像素点给水平预缩放模块,水平预缩放模块对像素点进行预缩放处理,垂直缩放模块对预缩放像素点进行垂直缩放处理后输出缩放后的像素点,缩放后的像素点经过复位解码模块后输出解码后的像素点;

在实施过程中我们采用的缩放窗口为4×4,缩放的插值函数为S(x);

水平预缩放模块由异步FIFO_1、ROM_1组、寄存器单元、水平运算单元和水平负反馈电路组成,如图2所示;

垂直缩放模块由异步FIFO_2、ROM_2组、BRAM组、垂直运算单元和垂直负反馈电路组成,如图3所示;

假设当前一帧原始图像的分辨率为o_width×o_length,缩放后的图像分辨率为a_width×a_length;

复位编码模块在摄像头输入时钟频率下获取当前第k行的第i个像素点,并对当前第k行的第i个像素点的最高位进行扩展,将所扩展出的最高位作为标志位,将其余位作为数据位,如图4所示,图4为对任意行的各个的像素点依次进行的编码后的输出格式;再根据摄像头所传递的帧使能信号判断当前第k行的第i个像素点是否为一帧图像的第一行的第一个像素点,若是,则将标志位置为“1”,否则,将标志位置为“0”;从而得到编码后的第k行的第i个像素点;

ROM_1组是根据行偏移量作为存储地址并存储有行插值系数;建立存储插值系数表的具体过程为:将[0,1]区间等分成128个小区间,即每个小区间长度为1/128。假设插值函数为S(x),△x为行偏移量,△x的取值即为区间[0,1]内为1/128倍数所有值,可以计算出S(x)相对应的值,即为插值系数。由于对于同一个△x需要计算四个不同的S(x),即S(1+△x),S(△x),S(1-△x),S(2-△x),插值表如1所示;

表1插值系数表

Δx S(1+Δx) S(Δx) S(1-Δx) S(1-Δx)
0 0 32768 0 0
1/128 -126 32763 132 -1
2/128 -248 32748 272 -4
3/128 -366 32724 419 -9
4/128 -481 32690 575 -16
. . . . .
. . . . .
. . . . .
124/128 -24 575 32690 -481
125/128 -16 419 32724 -366
126/128 -4 272 32748 -248
127/128 -1 132 32763 -126

假设编码后的第k行的第i个像素点经过水平预缩放模块后得到预缩放后的第k行的第j个像素点,预缩放后的第k行的第j个像素点映射在水平预缩放前的图像上为第k行的第s个像素点,其中,s=j×(o_width/a_width),则行偏移量为s的小数部分,s的整数部分记为c,假设当前一帧预缩放前图像A分辨率为o_width×o_length,预缩放后的图像B分辨率为a_width×o_length;那么根据比例我们可以得到B(j,k)在A上的的映射坐标为A(s,k)=A(j*(o_width/a_width),k),其中缩放因子为a_width/0_width;

异步FIFO_1按照摄像头输入时钟频率从第k行的第i个编码后的像素点开始依次写入第k行的各个编码后的像素点直到达到水平预存值r时,由于异步FIFO_1的读和写时钟频率不一样,在实际中水平预缩放时钟频率与理想时钟频率会有差异,异步FIFO_1读和写的时钟频率不理想时会出现读空或者存满的现象,预存数据是为了防止读空的情况发生,在具体实施时根据时钟频率的精度将水平预存值r设为10,如图5、图6所示,预存r个预缩放前像素点由水平预缩放的电路中的预存控制器进行计数控制,当预存像素点未达到r时,异步FIFO_1的读使能接口所连接多路选择器被预存控制器一直锁定在为0上,此时FIFO_1只写不读从而预存数据;将异步FIFO_1的深度设为1024防止存满情况发生;异步FIFO_1再将第k行的第i个编码后的像素点传递给寄存器单元,直到寄存器单元所接收的像素点个数为n时,由于缩放的窗口为4×4,故n的值设为4,当寄存器单元接收到4个像素点时,才能进行进行预缩放的处理,表示寄存器单元存储完毕,从而开始计算预缩放后的第k行的第j个预缩放后的像素点,如图5、图6所示行控制器记录当前的第j个像素点的行坐标;

水平运算单元从寄存器单元中获取第k行的n个编码后的像素点,再根据第k行的第j个预缩放后的像素点的偏移量从ROM_1组读取相应的n个插值系数并按照流水线的方式进行插值计算,如图5、图6所示,将缩放因子与当前第j个像素点的行坐标相乘得到相乘结果s,s的0至6位为小数部分,s的小数部分作为当前第j个像素点的偏移量输出至ROM_1组;如图7水平运算单元将从ROM_1组中读取4个插值系数与寄存器器单元中的缩放前数据进行预缩放运算,将运算分为乘法、加法与位移三步操作,用寄存器暂存每一步结果传递给下一步达到实现流水线化处理,从而得到预插值数据并作为第k行的第j个预缩放后的像素点,判断c*=c+2是否成立,若成立,则令第k行的第j个预缩放后的像素点的预缩放使能信号为0,否则为1;在对图像进行预放大处理时,由于缩放因子小于1,每次判断c*是否等于c+2的结果一定为不等于,水平预缩放使能信号在未收到反馈信号时一直置为1,如图5所示,当反馈信号无效时,使能信号锁定在1上;在对图像进行预缩小处理时,由于缩放因子大于1,每次判断c*是否等于c+2的结果可能为相等也可能为不相等,故需要用逻辑电路判断该结果,如图6所示,假设反馈信号无效,多路选择器选中图6中虚线方框内逻辑电路的输出结果;在虚线方框中,缩放因子与j的相乘得到的s*,s*第7至16位作为s*整数的部分c*,判断c*与存储在寄存器中的s整数部分c相减后的结果是否为2,若成立,则将使能信号置为0,否则,将使能信号置为1;

当第k行的第j个预缩放后的像素点计算完毕,异步FIFO_1输出empty输出信号给水平负反馈电路,水平负反馈电路根据empty输出信号产生反馈信号;

若反馈信号有效,则寄存器单元中所存储的第k行的n个编码后的像素点保持不变,i不加1,如图5、图6所示负反馈电路根据FIFO的empty信号产生反馈信号给行计数器,若反馈信号有效则行计数器停止计数,并将使能信号置为0;若反馈信号无效,则对寄存器单元中所存储的第k行的n个编码后的像素点进行更新判断,假设预缩放后的第k行的第j+1个像素点映射在水平预缩放前的图像上为第k行的第s*个像素点,c*为s*的整数部分,若c*=c,则保持i不变,并利用寄存器单元中所存储的第k行的n个编码后的像素点计算第k行的第j+1个预缩放后的像素点,若c*≠c,则将i加1后,使得寄存器单元中所存储的第k行的n个编码后的像素点进行1位的移位寄存,并得到更新后的第k行的n个编码后的像素点用于计算第k行的第j+1个预缩放后的像素点;在对图像进行预放大处理时,由于缩放因子小于1,每次判断c是否等于c*的结果可能为相等也可能为不相等,故需要用逻辑控制电路来判断该结果,如图5所示,此时预存控制信号已经失效,多路选择器选中图5虚线方框内逻辑电路的输出结果;在虚线方框内,缩放因子与j的结果相乘得到的s*,s*的第7至16位作为s*的整数部分c*;判断c*与存储在寄存器中的s的整数部分c是否相等,若不相等则把异步FIFO_1的读使能信号en_rd置为1并进行预缩放像素点的更新并输出至寄存器单元中,若相等则把异步FIFO_1的读使能信号en_rd置为0,寄存器单元中的预缩放前像素点不进行更新;在对图像进行缩小处理时,由于缩放因子大于1,每次判断c是否等于c*的结果一定为不相等,故每次都进行更新操作,如图6所示,预存控制信号已失效,异步FIFO_1的读使能信号一直锁定在1上;

ROM_2组是根据列偏移量作为存储地址并存储有列插值系数;建立存储插值系数表的具体过程为:将[0,1]区间等分成128个小区间,即每个小区间长度为1/128。假设插值函数为S(y),△y为列偏移量,△y的取值即为区间[0,1]内为1/128倍数所有值,可以计算出S(y)相对应的值,即为插值系数。由于对于同一个△y需要计算四个不同的S(x),即S(1+△y),S(△y),S(1-△y),S(2-△y);假设第k行的第j个预缩放后的像素点经过垂直缩放模块后得到垂直缩放后的第b行的第j个像素点,垂直缩放后的第b行的第j个像素点映射在垂直缩放前的图像上为第v行的第j个像素点,其中,v=b×(o_length/a_length),则列偏移量为为v的小数部分,v的整数部分记为d;且第v行的各个像素点的列偏移量均相同;

异步FIFO_2按照水平预缩放频率从第k行的第j个预缩放后的像素点开始依次写入第k行的各个预缩放后的像素点直到达到垂直预存值u时,FIFO_2预存数据是为了防止水平预缩放时钟频率与垂直缩放时钟频率由于精度不准导致FIFO_2出现读空现象,具体实施时电路中u设为a_width;如图8、图9所示,当预存控制器未计数到u时,异步FIFO_2的读使能信号接口所连接的多路选择器被预存控制器一直锁定在0上,此时异步FIFO_2只读不写直到预存入u个数据,异步FIFO_2再按照垂直预缩放频率将第k行的第j个预缩放后的像素点传递到BRAM组中,直到BRAM组所接收的像素点个数为n×a_width时,表示BRAM组存储完毕,由于缩放窗口为4×4,故BRAM当接收到4×a_width个像素点时垂直方向的缩放才能进行,此步骤的实现也由预存控制器实现,此时异步FIFO_2读使能被锁定在1上,BRAM不断地读取异步FIFO_2中的预缩放像素点,直到读取4×a_width个像素点;从而对所存储的n×a_width个预缩放后的像素点更新判断,假设第b-1行的第j个像素点映射到缩放前的图像中为第v*行的第j个像素点,d*为v*的整数部分,若d*=d,则BRAM从异步FIFO_2中读取第k行中第j个预缩放后的像素点并覆盖写入到存储第k-n+1行第j个的BRAM存储区域处;每次覆盖写入由图8、图9中的载入控制单元控制,该循环载入控制由状态机实现,若d*≠d,则BRAM中所存储的n×a_width个像素点保持不变,在对图像进行放大时,由于缩放因子小于1,每次判断d是否等于d*的结果可能为相等也可能为不相等,故需要用逻辑控制电路来判断该结果,如图8所示,此时预存控制信号已经失效,多路选择器选中图8虚线方框内逻辑电路的输出结果;在虚线方框内,缩放因子与j的结果相乘得到的v*,v*第7至16位作为v*整数的部分d*,判断d*与存储在寄存器中的v的整数部分d是否相等,若不相等则把异步FIFO_2的读使能信号en_rd置为1,BRAM进行更新操作,BRAM从FIFO_2读取第k行第j个像素点并覆盖写入到存储第第k-3行第j个的BRAM存储区域处,若相等则把异步FIFO_2的读使能信号en_rd置为0,BRAM不进行更新操作;在对图像进行缩小时,由于缩放因子大于1,每次判断d是否等于d*的结果一定为不相等,故每次都进行更新操作,如图9所示,此时预存控制信号已经失效,异步FIFO_2的读使能信号一直为1,BRAM每次都执行更新操作;

垂直缩放单元从BRAM组中读取n行中各行的第j个预缩放后的像素点,再根据第b行的列偏移量从ROM组读取相应的n个插值系数并按照流水线的方式进行插值计算,,垂直缩放单元,如图10所示,接收ROM组的4个插值系数和BRAM中的四个预缩放像素点,由于BRAM的更新是循环覆盖写入实现的,第k行的数据每次存储的位置不同,所以需要4个多路选择器来选择BRAM中的预缩放像素点,该选通信号由状态机循环生成,之后将相应的数据进行乘法、加法、位移三步流水线运算,得到缩放数据并作为第b行的第j个缩放后的像素点;判断d*=d+2是否成立,若成立,则令第b行的第j个预缩放后的像素点的预缩放使能信号为0,否则为1,在对图像进行放大处理时,由于缩放因子小于1,每次判断d*是否等于d+2的结果一定为不等于,垂直缩放使能信号在反馈信号无效时一直为1,如图8所示,反馈信号无效时,使能信号一直锁定在1上;在对图像进行缩小处理时,由于缩放因子大于1,每次判断c*是否等于c+2的结果可能为相等也可能为不相等,故需要用逻辑电路判断该结果,如图9所示,假设反馈信号无效,多路选择器选中虚线方框内逻辑电路的输出结果,缩放因子与j的结果相乘得到的v*,v*第7至16位作为v*整数的部分d*,判断d*与存储在寄存器中的v的整数部分d的相减结果是否为2,若成立,则将使能信号置为0,否则,将使能信号置为1;

复位解码模块按照垂直预缩放频率获取第b行的第j个缩放后的像素点,并根据其标志位产生缩放后图像的帧使能信号后,删除标志位,从而得到解码后的第b行的第j个像素点用于显示。复位编码模块与复位解码模块的设计确保了电路的稳定性与高质量的缩放图像。

本实施例中,一种实时视频缩放方法是按如下步骤进行:

步骤1、假设当前一帧原始图像的分辨率为o_width×o_length,缩放后的图像分辨率为a_width×a_length;定义原始图像中的任意一行像素点为第k行像素点,第k行像素点中的任意一个像素点为第i个像素点;

假设预缩放前的第k行的第i个像素点经过预缩放处理后得到预缩放后的第k行的第j个像素点;

假设预缩放后的第k行的第j个像素点映射在预缩放前的图像上为第k行的第s个像素点,其中,s=j×(o_width/a_width),则行偏移量为s的小数部分,s的整数部分记为c;

假设预缩放后的第k行的第j-1个像素点映射在预缩放前的图像上为第k行的第s*个像素点,s*的整数部分记为c*;

假设缩放后的第b行的第j个像素点映射在缩放前的图像上为第v行的第j个像素点,其中,v=b×(o_length/a_length),则列偏移量为v的小数部分,v的整数部分记为d;且第b行的各个像素点的列偏移量均相同;

假设缩放后的第b-1行的第j个像素点映射到缩放前的图像中为第v*行的第j个像素点v*的整数部分记为d*;

步骤2、初始化k=1、b=1;

步骤3、初始化i=0;

步骤4、初始化j=0;

步骤5、将i+1赋值给i;

步骤6、对当前第k行的第i个像素点的最高位进行扩展,将所扩展出的最高位作为标志位,将其余位作为数据位;

步骤7、判断当前第k行的第i个像素点是否为一帧图像的第一行的第一个像素点,若是,则将标志位置为“1”,否则,将标志位置为“0”;从而得到编码后的第k行的第i个像素点,执行步骤5;

步骤8、判断i≥n是否成立,若成立,则执行步骤9;否则,执行步骤5,由于采样窗口4×4,水平预缩放至少需要n个数据,若没有n个数据则返回步骤5进行数据更新;

步骤9、将j+1的值赋给j,判断j>a_width是否成立,若不成立,执行步骤10,j>a_width不成立时,说明第k行像素点未全部完成预缩放,需要执行步骤10继续对第k行第j+1个像素点进行预缩放,否则,再判断k≥n是否成立,若成立,将k+1赋值给k并执行步骤15,否则,将k+1赋值给k并执行步骤3,当j>a_width成立时,说明第k行的预缩放像素点已全部输出,开始输出第k+1行的预缩放像素点,若k≥n不成立,则说明垂直缩放还未开始进行,此时需要返回步骤3继续进行第k+1行的水平预缩放像素点输出,若k≥n成立则说明垂直缩放已开始进行,故跳转到步骤15,步骤15会将b+1的值赋给b,跳转到步骤15的意义在于当k≥n时b与k要一起更新,即水平预缩放与垂直缩放一起执行;

步骤10、根据第k行第i、第i-1......第i-n+1个缩放前图像点与第k行第j个缩放后的像素点的偏移量计算出第k行第j个预缩放像素点;

步骤11、判断c*=c+2是否成立,若成立,则令第k行的第j个预缩放后的像素点的预缩放使能信号为1,否则为0;

步骤12、判断k≥n是否成立,若成立,执行步骤13,当k≥n时说明水平预缩放数据已达到n×a_width,可以输出第k行第j个缩放后像素点;否则,再判断c*=c是否成立,若c*=c成立,则执行步骤9,否则,执行步骤5;当k<n时说明水平预缩放数据未达到n×a_width,当前第k行第j个像素点不能进行垂直缩放,故接下来对第k行第j+1个像素点进行预缩放,在对第k行第j+1个像素点预缩放前需要判断第k行第i个缩放前像素点是否更新,若c*=c成立,则不需要更新,执行步骤9;若c*=c不成立,则需要更新,执行步骤5;

步骤13、根据第k、第k-1......第k-n+1行中各行第j个预缩放后的像素点以及第b行第j个缩放后像素点的偏移量计算出缩放后的第b行第j个像素点;

判断14、d*=d+2是否成立,若成立,则令第b行的第j个预缩放后的像素点的预缩放使能信号为1,否则为0;

步骤15、判断j>a_width是否成立,若成立,则将b+1赋值给b后,执行步骤17,否则,b保持不变并执行步骤16,若j>a_width成立表明第b行缩放后像素点都已全部输出,接下来跳转到步骤12开始处理第b+1行数据;若j>a_width不成立则表明第b行的缩放后像素点未全部输出,接下来跳转到步骤16进行更新判断;

步骤16、判断c*=c是否成立,若成立,则执行步骤9,否则,执行步骤5,更新判断后跳转到步骤5或步骤9输出第k行第j+1个预缩放后的像素点;

步骤17、判断b>a_length是否成立,若成立,则当前一帧原始图像处理完毕,并返回执行步骤1处理下一帧原始图像,否则,执行步骤18;

步骤18、判断d*=d是否成立,若不成立,则执行步骤3,否则,执行步骤19,判断输出第b+1行第j个像素点前是否需要更新,若d*=d不成立则需要更新,执行步骤3;若d*=d成立则不需要更新,执行步骤19;

步骤19、根据第k、第k-1......第k-n+1行中各行第j个预缩放后的像素点以及第b行第j个缩放后的像素点的偏移量计算出缩放后的第b行第j个像素点;

步骤20、判断d*=d+2是否成立,若成立,则令第b行的第j个预缩放后的像素点的预缩放使能信号为1,否则为0;

步骤21、判断j>a_width是否成立,若成立,则将b+1值给b后,执行步骤17,否则,b保持不变,并将j+1的值赋给j后,执行步骤19,由于第b行各个像素点对应的d值都相同,所以对第b行中的任意缩放后像素点都不需要更新,故将j+1的值赋给j后执行步骤19,直到j>a_width成立时表面当前第b+1行缩放后像素点都已全部输出,之后执行步骤17,对第b+2行进行处理。

图11、图12为与近年提出的各种缩放电路最高频率与处理帧率的对比图,其中,的横坐标为以下参考文献中所提出的缩放架构:

【1】《面向硬件实现的一种视频实时缩放算法》;

【2】《Hardware architecture ofbi-cubic convolution interpolation forreal time image scaling》;

【3】《Real-time FPGA-based architecture forbicubicinterpolation:anapplication for digital image scaling》;

【4】《视频图像缩放的FPGA设计与实现》;

【5】《Algorithm and vlsi architecture for highperformanceadaptive videoscaling》;

【6】《VLSI Realization ofLanczos Interpolation for a Generic VideoScalingAlgorithm》;由图中数据可见,该硬件电路在速度性能上较传统的架构相比有很大的优势,并且能实现高帧率的缩放。

综上所述,本发明能暂存少量数据后对摄像头采集的视频数据进行实时同步的处理,从而能绕开传统架构中将图像数据读取/写入存储设备这个过程耗时带来的性能瓶颈,整个缩放过程中水平预缩放与垂直缩放完全并行并且各模块采用了深度流水线化的设计,故实时视频缩放的硬件电路能完成超高速的视频图像处理,复位编码模块与复位解码模块确保了电路的稳定性与高质量的缩放视频。

20页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:索引映射编解码中的跳出像素编解码方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类