闲庭信步使用图像验证平台加速FPGA的开发:第二十九课——车牌识别的FPGA实现(1)车牌定位的预处理
(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!)
《闲庭信步使用图像验证平台加速FPGA的开发》这个系列基本要结束了,最后我们用一个车牌识别的实例来进行收官,大约需要六节课的样子。
这个实例是参考哔哩哔哩上大磊老师讲的《基于FPGA的车牌识别》,流程如下所示,成工是将与处理的一些模块进行了替换,因为我们有现成的rgb2ycbcr,二值化,sobel,腐蚀和膨胀相关的模块,后面的车牌边界和字符区域的水平投影,竖直投影,字符的识别按照自己的理解进行了一些改进。最主要的改进还是将仿真变成了自动化的仿真。本节课就对车牌上下左右边界的定位进行预处理。
车牌上下左右边界的定位,先将RGB图像转换成Ycbcr的格式,然后取Cb的通道进行二值化,之所以取Cb通道是因为大部分车牌的背景都是蓝色的。Cb通道二值化后进行腐蚀操作,对腐蚀后的图片再进行sobel边缘检测,最后再进行膨胀就完成了预处理,预处理后的图片就可以进行车牌上下左右边界的定位操作了。
预处理的各个模块我们在前面的章节都有实现,直接调用即可,在顶层的top模块中例化上面的各个模块,为了能将每一步的处理都能保存图片查看,这儿成工用了img_sel信号来进行选择。
下面就是对各个模块的例化,有个地方需要注意一下,那就是设计到行缓存的操作时序优化延时至少一行,所以我们在data_cache3模块中会在最后补一行,但是对于连续的行缓存(腐蚀,sobel,膨胀3个操作都需要行缓存),后面的操作都要在前面已经补了一行的基础上再补一行,行的位置需要根据DELAY参数来确定。所以整个预处理操作下来,图像最终至少延时3行。同时也可以看出,这个图像的预处理需要处理五帧图片。
在tb_image_sim文件中,我们来介绍一个新的功能,那就是关联数组,关联数组光看定义是不好理解的,用实例就能轻松的掌握。如下所示,img的input文件夹下有很多的测试图片,我想要那张就要把这一张的名称写在测试程序里面。那我们可不可以只用一个标号就可以取出来对应的图片呢?这时候就可以使用关联数组了。
如下我们新建了car和style两个关联数组,数组的标号是int类型,里面存储的内容是string类型,其中car就是存储上面图片的名称,sytle存储要输出图片的名称,这样后续的操作只需要对car_index和style_index操作即可,不需要再对图片名称进行直接处理了。
如下新增一个initial块,完成两个关联数组的初始化。
在下一个initial块中,分别将预处理的五帧图片进行保存。这儿有一点需要注意,198行是对队列进行清空的操作,否则图片数据会继续往后存储,那保存的五幅图片都是Cb通道的图片。
双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。
因为要处理五幅图像,处理时间较长,modelsim的Transcript有如下的打印信息。
最后我们打开img/output文件夹,就可以看到预处理每一步的处理结果。
当然大家也可以修改car_index选择不同的值重新进行仿真,比如car_index=9重新进行仿真,img/output文件夹下的图片如下。
到现在就能体现出来图像验证平台的优势了,可以直接调用模块快速完成预处理,这样就可以把精力用在处理算法的开发上来。