闲庭信步使用图像验证平台加速FPGA的开发:第三十三课——车牌识别的FPGA实现(5)车牌字符的识别
(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!)
前面四堂课最终完成了车牌字符的分割,也就是能够定位每个字符的位置,这样的话,就可以对这些字符进行识别的,字符的识别需要两个模块,一个是字符特征值的提取,一个是通过卷积完成模版的匹配。
对于字符特征的提取,我们用处理后的图片进行说明,就是我们有了车牌中每个字符的位置信息,就可以对每个字符进一步的分割,本例分割成8行5列共40个网格,再对每个网格中的像素点进行统计,根据设定的阈值让每个网格取0或者取1,每个字符就能得到5x8=40个网格的统计值,这些值放在二维数组里面,这个数组存储的值就是字符的特征值。由于有8个字符要提取特征值,最后把所有字符的特征值放在一个数组里面,那就是5x8x8的三维数组。
在\src\char_recognization文件夹下新建char_feature_extraction.sv文件,首先确定每个字符的左右边界,每个字符的宽度和高度,每个字符分割成5x8个网格每个网格的高度和宽度。
其中计算div_width和div_height时,用到一个求余数的function,实现方式如下,有了余数,就可以对网格精确的细分。
其中求每个网格高度的位置信息可以直接使用除法计算,如下图注释掉的代码;如果要避免除法的运算,可以根据网格高度的信息用加法来进行判断。
同理为了获取每个网格宽度的位置信息,也可以直接用除法进行计算,注意这儿使用的是generate,就是8个模块同时运行,也就是要使用8个除法器,如下注释的部分。当然也可以避免使用除法器,直接根据每个网格的宽度信息通过加减来进行判断。
然后就是对每个网格中像素值为1的点进行统计,分别存放到数组对应的位置。
当完成车牌字符所有网格的统计后(在char_bottom + 1的那一行),对数组的进行0/1归一化,这儿用的方法很简单,就是如果网格中为1的像素点超过1/2,判定这个网格的特征值是1,否则是0,当然这个1/2的值是可以变动的,比3/5。至此,车牌中所有字符的特征值都统计完成。
完成了车牌字符的特征值统计,下一步就要将新统计的特征值和事先准备好的模版进行匹配。在\src\char_recognization文件夹下新建char_template_matching.sv文件,在这个文件中,有事先设定好的字母,数组和汉字字符的模块,这些都是大磊老师他们提供的,我们可以直接拿过来用。
如下就是一些模版。
特征值的比对思路比较简单,就是数字和字母的字符分别和34个CHAR的模版进行比对并分别进行打分,每次比较完毕后如果得分高于上一次比对的得分就更新得分值,并更新得分最高模版的标号;34个模块比对完毕后就可以得到得分最高的那个模版,也就是匹配的结果。汉字匹配的思路也是完全一样的。如下主要是通过状态机完成模版的比对,MATCH_JUDGE状态用来判断是CHAR的比对还是CHINESE的比对;CHINESE_MATCH状态进行汉字的比对,CHAR_MATCH状态进行数字和字母的比对;MATCHING状态下完成每个字符和一个模版的一次比对;SCORE状态下完成每次比对得分的更新和得分最高模版编号的记录。INDEX状态控制完成8个字符的比对。分析下来大家可以看出来,模版的比对是非常花时间的。
如下主要实现中文模版比对的相关控制。
如下主要实现字母和数字模版比对的相关控制。
使用plate_char_cnt信号控制8个字符分别和相应的模版进行比对。
如下实现每个字符的5x8次比对。
如下实现每个模版匹配完毕后最高分的更新和最高分对应模版编号的更新。
如下主要实现每个要匹配的字符和每次要匹配的模块分别放到compare_char和compare_temp数组中。
最后输出8个字符分别对应的模块编号。
\src\char_recognization文件夹下的char_recognization.sv文件完成对char_feature_extraction和char_template_matching模块的例化。
在\src\char_recognization文件夹下新建char_recg_out.sv文件,用来将划分的网格信号在图片中显示出来。首先获取每个字符的区域信息。
通过计算获取每个网格的信息,因为这个文件主要用于显示,不是工程必须得文件,所以这儿时间使用了除法。
在top文件夹下例化了plate_location,location_out,char_segmentation,char_sgm_out,char_recognization,char_recg_out等模块。
在tb_image_sim文件的initial块中,完成相应图片的保存。
双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。
完成三幅图像的处理和保存,处理时间较长,modelsim的Transcript有如下的打印信息。
最后我们打开img/output文件夹,就可以看到相关的图片。