首页 > 代码库 > FPGA图像处理之画中画(pip)
FPGA图像处理之画中画(pip)
硬件结构和软件的一些情况介绍:
FPGA,arria ii gx系列的芯片。altera的开发板 ,http://www.altera.com.cn/products/devkits/altera/kit-aiigx-pcie.html我的开发套件信息。
重要的两个信息:FPGA: EP2AGX125EF35。DDR2:1G,64位的。运行在200M。
输入是1080P,即1920*1080,RGB各8位,共24位。时钟速度148.5M。输出也是1080P。也就是DDR2都是在1080P进行速率传输。
我毛华望QQ849886241,个人博客http://blog.csdn.net/my_share
这个是效果图。
大图是1080p,小图是1080p的1/16. 人就是我了。呵呵。难看吧。
完成过程的问题和过程中的思考
需要把大图和小图的数据都存进ddr2里面,怎么存,怎么取才能达到那个效果呢???
小图的大小,480*270.位置是距上面50点,距右面200点,距左面1240点。
第一种方法:
把大的整幅画面存起来,把大图的像素就是对应的DDR2的地址,从0--1920*1080位置正好和图的像素点位置对应。.然后在显示小图的那个位置的那块ddr2存储空间,用小图的色彩进行覆盖,小图的ddr2地址第一行位置大概在50*1920+1240到50*1920+1720。一行一行覆盖,270行。
然后按照ddr2的地址一一读出来,就显示这个效果了。
第二种方法:
就是把大图所有像素读进ddr2地址从1---1920*1080,然后把小图也读进ddr2地址从2000*1080开始,接下来呢?就是在大图输入到小图的位置的时候,即场频VS到50,HS到1240的时候,就把小图的第一点从ddr2里面读出来,覆盖大图那个像素点值。这个是输入的时候呦,VS,HS是大图的。然后覆盖大图的数据(输入的就是大图)。就是这样一一覆盖。其实第一种是小图过来的时候,覆盖大图DDR2的位置。现在是在大图输入近ddr2前,就用上一张小图的数据覆盖了,然后在读入到ddr2里面。
第三种方法:
前面一样, 就是把大图所有像素读进ddr2地址从1---1920*1080,然后把小图也读进ddr2地址从2000*1080开始,接下来呢?在读出的时候,在场频VS到50,HS到1240的时候,就把小图的第一点从ddr2里面读出来。这个场频和行频是读出给显示器的行频场频,第二个方法是大图的读入的行频场频。也就是说,是在读出给显示器前的时候小图覆盖了那块区域。
我这里只是简单说明了,我的方案,在ddr2的部分,并没有具体说,怎么读出来,一次读多少数据,怎么配置RAM、fifo来配合ddr2的存储。
其实第一个方法是不可以实现的,因为小图覆盖了大图,还是大图覆盖了小图呢??因为我目前用一个摄像头去完成的,如果2个摄像头的话,覆盖时间上就会问题了。谁覆盖谁说不准,就会有图像闪烁现象,就是一会是大图一会是小图。所以第一个方案并不可取。第二个方法,我也没有采用,虽然能完全覆盖,这个没问题,可是问题也很多,小图是以前就存进ddr2了,然后在覆盖大图的,好像小图晚了一帧,其实没事的看不出来的。其实问题在复杂,小图也需要实时更新,然后还要配合读出,覆盖大图,在存进去。没有第三个方案,在实现上简单(其实真的没差多少)。所以我用的第三个方案。
我描述硬件和ddr2的情况是考虑的实现起来是否ddr2的吞吐量够。1080p加上一个小图,在这种情况下,吞吐量是够的。但是当时写的时候,完全没在意,造成过一次吞吐量不够的现象,所以我想提醒,目前按照我使用的dd2的控制器的效率来看,1080p加一个小图,快到ddr2的吞吐量继续了。
如果你也做的是这个的话,就参考一下吧。
FPGA图像处理之画中画(pip)