` 基于Verilog的垂直投影实现 一、概述 投影,在立体几何中我们学到过,是空间直线在某个方向上的投影,那么图像处理中也是这种投影思想。最简单的投影:水平方向投影,将图像数组进行列求和;垂直方向投影,将图像数组进行行求和。 在做基于FPGA的实时车牌精确定位时,为得到车牌区域的左右上下边界,用到了水平和垂直投影,由于图像是按行扫描,相对水平投影垂直投影复杂些,本章节主要针对垂直投影进行研究。 二、方案 基于Verilog的垂直投影的实现,考虑使用双口ram、fifo/shfit_rams 实现,但是使用ram实现时,由于要操作地址,控制逻辑复杂,而且在写回时消耗的拍数比较多,而采用fifo来实现则更简单些,利用其先进先出的特点,设置深度为图像的宽度,这里使用的是640.其实,就是做了一行图像数据,等到下一行到来时,读出缓存的数据与新的图像数据相加,再写回fifo,最后在场消隐区内再读出fifo的数据记录跳变点位置(波峰的上升沿和下降沿)就是所要求的左右边界。这里由于fifo读延时为1,所以读请求早于写请求一拍。如图1所示 图1 读写FIFO 逻辑简图
如图2所示,可以看出波谷的左右两个跳变沿,利用这个特征即可定位出两个物体的左右边界位置。 I=imread('test.bmp'); I=rgb2gray(I); [m n]=size(I); for y=1:n S(y)=sum(I(1:m,y)); end y=1:n; figure subplot(211),plot(y,S(y));
图2 matlab实现
四、Verilog实现 按照matlab的思路就是每列值相加,得到一个垂直统计图;这里采用FiFo来存储统计值,由于fifo的深度在生成时只能是2^n,而在进行图像处理时,图像的宽度不等,因此需要私人定制缓存的深度,修改例化参数如图4所示,从Modesim仿真图5可以看到,当写fifo的深度达到640时已经写满了(full),而实际上我们的设的fifo的深度是2^10.
图3 FIFO
图4 修改例化参数
图5 Modesim 仿真 花费了一天的时间终于把这个给搞定了,在之前章节的基于Matlab与Modesim视频流仿真平台上,加入垂直投影逻辑,使用脚本仿真,效率提高了很多。如图6所示Verilog图像处理的结果。
图 6 单个物体的左右边界
在单个物体基础之上,在加一个目标,部分代码如下图7所示,处理的效果如图8所示
图 7 部分Verlog代码
图 8 两个目标的左右边界定位 这里只做了两个物体的实验,更多的比如车牌的字符和数字只需更改图7的逻辑代码即可,同时涉及到行缓存的设计以及水平投影的Verilog设计后续将会做详细说明。欢迎关注微信公众号:FPGA自习室。 `
|