本发明涉及图像处理技术领域,具体涉及一种实时畸变图像处理加速装置。
背景技术:
在VR一体机系统中,传送到显示屏上的图像需要从解码后的正常形状(图1中的左图所示)经过畸变成为扭曲形状(图1中的右图所示),而当该扭曲形状(图2中的左图所示)经过透镜显示出来时,由于透镜的光学畸变效果,最终显示出来是正常形状(图2中的右图所示)。该畸变图像处理功能通常由GPU完成,即非实时显示模式,每一帧图像的反畸形变换会经历GPU读取DRAM中一帧图像>回写到DRAM一帧图像>显示模块读取DRAM中一帧图像三步,这样反复读写DRAM会导致带宽浪费。畸变图像处理功能如果采用实时模式,则需要使用的数据缓存buffer数量巨大,这是因为对图像某一行的每个输出点(y坐标不变,x坐标由0递增)进行坐标计算得到畸变处理后的图像坐标,畸形变换的特性保证计算出来的点x坐标递增,但y坐标不能保证单调递增,只能保证连续,这就使得滤波窗口的跨度过大(一般输出图像的一行数据需要取输入图像的200行数据)。
技术实现要素:
本发明要解决的技术问题在于,针对现有技术的不足,提供一种实时畸变图像处理加速装置,克服现有技术畸变图像处理功能采用非实时显示模式,由于反复读写DRAM造成系统带宽浪费的缺陷以及在采用实时显示模式时滤波窗口跨度过大的缺陷。
本发明为解决上述技术问题所采用的技术方案为:
一种实时畸变图像处理加速装置,包括取系数DMA模块、取原图DMA模块、R行BUF控制模块、G行BUF控制模块、B行BUF控制模块、R插值模块、G插值模块、B插值模块,所述取系数DMA模块与所述取原图DMA模块相连,所述取系数DMA模块分别与所述R插值模块、所述G插值模块以及所述B插值模块相连,所述取原图DMA模块分别与所述R行BUF控制模块、所述G行BUF控制模块以及所述B行BUF控制模块相连,所述R行BUF控制模块与所述R插值模块相连,所述G行BUF控制模块与所述G插值模块相连,所述B行BUF控制模块与所述B插值模块相连,所述取系数DMA模块用于从外部存储器中提取并存储像素块系数,所述取原图DMA模块用于根据所述像素块系数计算图像的坐标,根据所述坐标的x坐标划分图像数据块,对所述图像数据块中的y坐标进行排序得到y坐标最小值和y坐标最大值,根据由所述y坐标最小值和所述y坐标最大值确定的y坐标范围以及所述图像数据块的x坐标范围从外部存储器中提取所述图像数据块,将所述图像数据块的R分量数据写入所述R行BUF控制模块、G分量数据写入所述G行BUF控制模块、B分量数据写入所述B行BUF控制模块,所述R插值模块用于计算畸变图像的R分量坐标,从所述R行BUF控制模块取所述R分量数据并进行插值运算,所述G插值模块用于计算畸变图像的G分量坐标,从所述G行BUF控制模块取所述G分量数据并进行插值运算,所述B插值模块用于计算畸变图像的B分量坐标,从所述B行BUF控制模块取所述B分量数据并进行插值运算。
根据本发明的实施例,所述取系数DMA模块包括命令产生器、数据分离器、第一数据缓冲器和第二数据缓冲器,所述命令产生器与所述数据分离器相连,所述数据分离器分别与第一数据缓冲器和第二数据缓冲器相连,所述命令产生器用于根据数据量和存放地址从外部存储器中提取数据,所述数据分离器用于将所述数据组合成所述像素块系数,第一数据缓冲器和第二数据缓冲器用于存储所述像素块系数。
根据本发明的实施例,所述取原图DMA模块包括命令产生器、数据分离器、数据缓冲器,所述数据分离器分别与所述命令产生器和所述数据缓冲器相连。
根据本发明的实施例,所述命令产生器包括R分量坐标运算模块、G分量坐标运算模块、B分量坐标运算模块、R分量坐标排序模块、G分量坐标排序模块、B分量坐标排序模块、地址生成器模块,所述地址生成器模块分别与所述R分量坐标排序模块、所述G分量坐标排序模块以及所述B分量坐标排序模块相连,所述R分量坐标运算模块与所述R分量坐标排序模块相连,所述G分量坐标运算模块与所述G分量坐标排序模块相连,所述B分量坐标运算模块与所述B分量坐标排序模块相连。
根据本发明的实施例,所述R插值模块、所述G插值模块或者所述B插值模块包括坐标计算模块、行BUF取数模块、插值模块,所述坐标计算模块分别与所述行BUF取数模块和所述插值模块相连,所述行BUF取数模块与所述插值模块相连。
根据本发明的实施例,在所述R行BUF控制模块、所述G行BUF控制模块或者所述B行BUF控制模块中建立指针和行号的映射表。
实施本发明的技术方案,具有以下有益效果:本发明实现了VR一体机系统的实时畸变处理,本发明对原图像映射坐标进行分块,根据落入每个块内的点的坐标排序结果确定提取原图像数据的范围,大大减小了滤波窗口跨度,降低了对图像数据的缓冲存储空间的要求,并且不会重复取数,避免了带宽浪费,本发明使用建表的方式建立每个分块内的行号与指针的对应关系,降低了取数查找时间。
附图说明
下面通过参考附图并结合实例具体地描述本发明,本发明的优点和实现方式将会更加明显,其中附图所示内容仅用于对本发明的解释说明,而不构成对本发明的任何意义上的限制,在附图中:
图1为现有技术对图像进行畸变处理的示意图;
图2为现有技术图像经过透镜后的光学畸变效果示意图;
图3为本发明实时畸变图像处理加速装置示意图;
图4为本发明取系数DMA模块组成方框图;
图5为本发明图像数据分块示意图;
图6为本发明按照行扫描方向从DRAM取每个块的系数过程示意图;
图7为本发明图像数据块系数组成示意图;
图8为本发明RGB分量系数组成示意图;
图9为本发明K系数组成示意图;
图10为本发明取原图DMA模块组成方框图;
图11为本发明取原图DMA模块命令产生器示意图;
图12为本发明根据分块系数计算并排序原图像坐标示意图;
图13为本发明原图像坐标输出示意图;
图14为本发明地址生成器的状态机示意图;
图15为本发明原图像数据读写控制示意图;
图16为本发明RGB插值模块示意图;
图17为本发明VR系统组成示意图。
具体实施方式
本发明实时畸变图像处理加速装置,包括取系数DMA模块、取原图DMA模块、R行BUF控制模块、G行BUF控制模块、B行BUF控制模块、R插值模块、G插值模块、B插值模块,取系数DMA模块与取原图DMA模块相连,取系数DMA模块分别与R插值模块、G插值模块以及B插值模块相连,取原图DMA模块分别与R行BUF控制模块、G行BUF控制模块以及B行BUF控制模块相连,R行BUF控制模块与R插值模块相连,G行BUF控制模块与G插值模块相连,B行BUF控制模块与B插值模块相连,取系数DMA模块用于从外部存储器中提取并存储像素块系数,取原图DMA模块用于根据像素块系数计算图像的坐标,根据坐标的x坐标划分图像数据块,对图像数据块中的y坐标进行排序得到y坐标最小值和y坐标最大值,根据由y坐标最小值和y坐标最大值确定的y坐标范围以及图像数据块的x坐标范围从外部存储器中提取图像数据块,将图像数据块的R分量数据写入R行BUF控制模块、G分量数据写入G行BUF控制模块、B分量数据写入B行BUF控制模块,R插值模块用于计算畸变图像的R分量坐标,从R行BUF控制模块取R分量数据并进行插值运算,G插值模块用于计算畸变图像的G分量坐标,从G行BUF控制模块取G分量数据并进行插值运算,B插值模块用于计算畸变图像的B分量坐标,从B行BUF控制模块取B分量数据并进行插值运算。根据本发明的实施例,取系数DMA模块包括命令产生器、数据分离器、第一数据缓冲器和第二数据缓冲器,命令产生器与数据分离器相连,数据分离器分别与第一数据缓冲器和第二数据缓冲器相连,命令产生器用于根据数据量和存放地址从外部存储器中提取数据,数据分离器用于将数据组合成像素块系数,第一数据缓冲器和第二数据缓冲器用于存储像素块系数。根据本发明的实施例,取原图DMA模块包括命令产生器、数据分离器、数据缓冲器,数据分离器分别与命令产生器和数据缓冲器相连。命令产生器包括R分量坐标运算模块、G分量坐标运算模块、B分量坐标运算模块、R分量坐标排序模块、G分量坐标排序模块、B分量坐标排序模块、地址生成器模块,地址生成器模块分别与R分量坐标排序模块、G分量坐标排序模块以及B分量坐标排序模块相连,R分量坐标运算模块与R分量坐标排序模块相连,G分量坐标运算模块与G分量坐标排序模块相连,B分量坐标运算模块与B分量坐标排序模块相连。R插值模块、G插值模块或者B插值模块包括坐标计算模块、行BUF取数模块、插值模块,坐标计算模块分别与行BUF取数模块和插值模块相连,行BUF取数模块与插值模块相连。在R行BUF控制模块、G行BUF控制模块或者B行BUF控制模块中建立指针和行号的映射表。
硬件架构
如图3所示,取系数DMA模块从DRAM取出每个块的系数,并存放在其内部sram中,然后在取原图DMA模块中,根据对应的系数去计算原图的坐标,并进行排序,得到每个块(32像素)对应的y坐标的最大值和最小值,用此y坐标的范围从DRAM中取数原始图像;接着,将取得的图像数据分别写入R行BUF控制模块、G行BUF控制模块、B行BUF控制模块;然后R插值模块、G插值模块、B插值模块各自计算对应的坐标。
取系数DMA模块
如图4所示,取系数DMA模块包括命令产生器、数据分离器、数据缓冲器1和数据缓冲器2。命令产生器用于根据每个系数块的数据量和存放地址向DRAM取数,数据分离器用于将DRAM取到的数据组合成每个块对应的系数,数据缓冲器1和数据缓冲器2都是用来存放每个块的系数。之所以分成两个缓冲器,是因为系数有两个用途,其一是用于计算出输入图像的坐标并从DRAM取出原图,其二是用于对取到的数据进行插值运算。下面具体描述命令产生顺序:每个输出点到输入点的映射关系是有一套系数(畸变系数)决定的,对输出图像进行分块,如图5所示,每个块共享一套系数。如图6所示,按照行扫描方向从DRAM取每个块的系数,每个块的大小为32x32或40x40,也就是说每个BLK的系数需要反复使用32x32或者40x40次。如图7所示,每个块的系数占1024bit,其中RGB的系数各占256bit,剩下256bit是K系数。如图8所示,RGB分量的系数由8个32bit的系数组成,a在低位,h在高位。如图9所示,K系数只使用到了256bit的前3个word,且每个word只使用了最低4bit,先放R的K系数,最后放B的K系数。这个K系数是用于对RGB分量的系数进行右移。
取原图DMA模块
如图10所示,同取系数DMA模块一样,取原图DMA模块也是由命令产生器、数据分离器、数据缓冲器组成。不同之处在于,取原图DMA模块的命令产生器较为复杂。如图11所示,首先根据输入的系数(RGB 3个分量的系数各不相同)按公式进行坐标计算,畸变映射关系是能够保证计算出来的x坐标单调递增,而y坐标虽不保证单调递增,但能保证连续。因此,按x坐标进行分块(x=0~31属于第1个块,x=32~64属于第2个块),落在每个块内的点使用y坐标进行排序,将最大最小y坐标输出给地址生成器,接着,地址生成器根据当前块的y坐标最大取数范围计算DRAM地址。
坐标运算模块
R分量坐标运算模块、G分量坐标运算模块和B分量坐标运算模块根据下面的流程计算出每个输出点(i,j)对应的输入映射坐标(x,y),其中outw表示输出宽度,outh表示输出高度,inw表示输入宽度,inh表示输入高度。
β=(outw*outh)>>k
q=g*i+h*j+β
xx=a*i+b*j+c*outh
yy=d*i+e*j+f*outh
m=xx*inw
n=yy*inh
x=(m<<8)/q
y=(n<<8)/q
坐标排序模块
如图12、图13所示,R分量坐标排序模块、G分量坐标排序模块、和B分量坐标排序模块根据分块系数计算输出图像每一行像素点所对应的原图像坐标,得到的x坐标在一行之内保持单调递增,y坐标只保证连续,于是可以对每个32像素分块(x=0~31属于第1个块,x=32~64属于第2个块)内点的y坐标进行排序,排序完成后直接输出。当没有坐标落在当前输入块时(比如一行的第一个映射点的x坐标是33,直接跳过了第一个分段0~31),直接输出无效块。由于做插值运算时除了需要左边的像素(x)外,还需要右边的像素(x+1),排序时需要将右边的像素也考虑进来(当某个有效输入点的坐标为x=31时,其右边的像素(x=32)对应的y坐标会在下一个分段内进行排序)。
地址生成器模块
地址生成器模块的输入是块分块ID,块有效(该分块需要取数),顶行号和底行号。图14描述了地址生成器的状态机:
状态0:表示初始状态,当输入块有效时跳转至状态1;
状态1:进行当前分块的行偏移地址计算,接着跳转至状态2;
状态2:进行当前分块的列偏移地址计算,当行计数器大于底行号时跳转至状态0,否则跳转至状态3;
状态3:进行取数命令发送,发送完毕后回到状态1。
行buffer控制模块
R行BUF控制模块、G行BUF控制模块、B行BUF控制模块使用40块行buffer,每个分块有对应的当前写指针及底行号,分别使用19位寄存器来存(一共有40个这样的寄存器组)。如图16所示,高6位存放块的写指针,低13位存放对应的底行号。当插值模块需要取数时,根据对应的列,得到对应的块号(x=0~31属于第1个块,x=32~64属于第2个块),通过查表得到对应的写指针及对应的底行号,再根据所需要取的行号同查表得到的底行号相减得到指针偏差,用写指针减去指针偏差就得到了读指针,用读指针从SRAM取数即可。这里,最多只存储2个输出行对应的原图像数据。
前面提到,本发明以40行buffer的代价实现了最大200行的滤波跨度,下面举例解释一下:
表1
如表1所示,对输出图像某一行的每个输出点(y坐标不变,x坐标由0递增)进行坐标计算得到输入图像坐标(畸形变换的特性保证计算出来的点x坐标递增,但y坐标不能保证单调递增,但是能保证连续),于是将每个计算出的坐标按x坐标划分到每个32像素的块中(如x坐标0~31属于第1个块,x坐标32~63属于第2个块),对每个块内的y坐标进行排序。可以看出,分块前的跨度(最大y坐标范围)是0~76行,分块后的跨度最大为2~13行,这样就显著降低了取数的峰值带宽。
插值模块
R插值模块、G插值模块、B插值模块按RGB分量分别做插值运算,如图16所示,首先进行坐标计算,然后用坐标的整数位向行buffer控制模块进行取数,然后用小数位及取到的原图像数据进行插值运算。凡是取到有效区域外的坐标,一律处理为black(像素RGB=0)。
这里插值运算采用临近4个像素的双线性插值,公式如下:
fx1=x&0xff
fx2=0x100-fx1
fy1=y&0xff
fy2=0x100-fy1
c0=fx1[7:0]×fx2[8:0]
c1=fx2[8:0]×fy1[7:0]
c2=fx2[8:0]×fy2[8:0]
c3=fx1[7:0]×fy2[8:0]
out0=(in0×c2+in1×c3+in2×c1+in3×c0+128)>>8;
其中,fx1,fy1表示取x坐标及y坐标的小数位,in0~3表示4个相邻点的原图像数据,out0表示插值计算得到的输出图像数据。
图17表示一种显示引擎架构,实时图像畸加速器变位于通路最前端,该模块完成畸变后将数据送往缩放模块,接着经过图像后处理模块,再跟UI通路缩放后的图像进行叠加,最终将数据送往液晶控制器。实时图像畸变加速器的输入是包含时间扭曲、图像畸变(畸变系数)、色散等信息的块映射系数,以及原始图像,输出是变换后的目标图像。此类畸形变化模块通常会设计成非实时的模式,因为实时畸形变化所需行buffer数量巨大,而本设计通过将行buffer切块(以32像素为单位进行分块),使得滤波窗口的跨度减小到可以接受的范围,最终以40行buffer的代价实现了最大200行的滤波跨度(输出图像的一行数据需要取输入图像的200行数据)
本领域技术人员不脱离本发明的实质和精神,可以有多种变形方案实现本发明,以上所述仅为本发明较佳可行的实施例而已,并非因此局限本发明的权利范围,凡运用本发明说明书及附图内容所作的等效结构变化,均包含于本发明的权利范围之内。