当前位置: 首页 > news >正文

闲庭信步使用图像验证平台加速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文件夹,就可以看到相关的图片。

http://www.lryc.cn/news/598351.html

相关文章:

  • OpenCV —— contours_matrix_()_[]
  • 删除排序数组中的重复项
  • 微服务的编程测评系统6-管理员登录前端-前端路由优化
  • 一文说清楚Hive中常用的聚合函数[collect_list]
  • 亿级流量短剧平台架构演进:高并发场景下的微服务设计与性能调优
  • Matplotlib详细教程(基础介绍,参数调整,绘图教程)
  • IO密集型、CPU密集型、负载、负载均衡
  • 校园英语杂志《校园英语》杂志社校园英语编辑部2025年第15期目录
  • 考研初试专业分146!上岸新疆大学!信号与系统考研经验,通信考研小马哥。
  • GitHub Actions打包容器,推送 AWS ECR 并使 EKS 自动拉取以完成发版部署
  • Redis数据类型与内部编码
  • Webpack配置原理
  • MongoDB 和 Elasticsearch(ES)区别
  • Windows 下配置 GPU 用于深度学习(PyTorch)的完整流程
  • matrix-breakout-2-morpheus靶场通过
  • 基于深度学习的胸部 X 光图像肺炎分类系统(二)
  • 小架构step系列24:功能模块
  • Android中compileSdk,minSdk,targetSdk的含义和区别
  • M3295NL专为千兆以太网设计,支持100/1000Mbps全双工通信M3295支持4对5类UTP电缆
  • SparkSQL 子查询 IN/NOT IN 对 NULL 值的处理
  • 数据结构 堆(3)---堆排序
  • 在 Windows 上安装设置 MongoDB及常见问题
  • 多源信息融合智能投资【“图神经网络+强化学习“的融合架构】【低配显卡正常运行】
  • 如何清理电脑c盘内存 详细操作步骤
  • dify 变量聚合器-聚合分组问题
  • 【Java工程师面试全攻略】Day12:系统安全与高可用设计
  • 再生基因总结
  • 腾势N9再进化:智能加buff,豪华更对味
  • Dataease2.10 前端二次开发
  • Java 实现 C/S 架构详解:从基础到实战,彻底掌握客户端/服务端编程