comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现

基于FPGA 的MXN维字符识别的实现

1 概述

本文的灵感来源于杨淑英老师的一张PPT(手写数字识别),在此特别鸣谢杨淑英老师。

一般机器视觉对事物是没有感知的,比如摄像头采集到一张苹果的图片,它本身是不知道那是什么东西,在计算机里边就是一个图像数据矩阵的存在。但是我们人类可以通过各种图像处理手段,不断提取事物的特征来让机器通过特征编码来识别和区分不同的事物。

2 一种MXN维的手写字符识别算法

b86d4cfa4e119059088ec6fdaabe0f0e.png

图1 识别过程

如图1所示,这是杨淑英老师PPT(手写数字识别)的一张图,对于一个字符,首先我们要找到字符的上下左右边界,然后在把它分为MxN维的矩阵,再提取矩阵的特征,最后通过特征库匹配来识别字符。此种方法有效的降低了目标的维数,为FPGA的实现提供了可能。

特征形成:根据被识别的对象产生出来的一组基本特征。

特征选择:对原始数据进行抽取,抽取那些对区别不同类别最为重要的特征,而舍去那些对分类并无多大贡献的特征,得到能反映分类本质的特征。

特征提取:是模式识别的关键,直接影响其识别的分类效果。两种方法:

1)以框架的左边框到数字之间的距离变化。

2)将每个数字分成N×N等份,对每一份内的像素个数进行统计,除以每一份的面积总数。

ef33cba14f13b9cabefadd92599fde6a.png

图2 25维手写体5

如图2所示,我们通过每一个小框黑色的占比来从新编码一个新的5X5矩阵,当模板与之匹配时即可识别数字5,我没还可以通过人帮助机器不断学习,让机器的识别更加准确。

分成N×N等份的好处是:

针对同一形状、不同大小的样品得到的特征值相差不大。有能力对同一形状、不同大小的样品视为同类,因此这里要求物体至少在宽度和长度上大于N个像素,否则太小无法正确分类。

3 matlab 仿真MXN维字符识别

第一步:首先找到字符上下左右边界。

I = imread('5.png');
Ib =im2bw(I);[h,w,d] =size(Ib);
ROW = w-1;
COL = h-1;
k=1;
for i=1:COLfor j=1:ROWif i>1 && j>1if (Ib(i,j) == 0 &&Ib(i-1,j) == 1) || (Ib(i,j) == 0 &&Ib(i+1,j) == 1) a(k) =i;b(k) =j;k=k+1;endendend
endmaxa =max(a); 
mina =min(a);maxb =max(b);
minb =min(b);%boundary
for i=1:COLfor j=1:ROWif(i > mina &&i < maxa)&&(j==minb||j==maxb)boundary(i,j,1)= 255;boundary(i,j,2)= 0;boundary(i,j,3)= 0;elseif(i == mina ||i == maxa)&&(j>minb && j<maxb)boundary(i,j,1)= 255;boundary(i,j,2)= 0;boundary(i,j,3)= 0;elseboundary(i,j,1)= I(i,j,1);boundary(i,j,2)= I(i,j,2);boundary(i,j,3)= I(i,j,3);endend
end

80cdaecb4c929786184bd0feee92e11a.png

图3 字符5的上下左右边界

第二步:分成MXN维。

%MXN DIM
for i=1:COLfor j=1:ROWif(i > mina &&i < maxa)&&(j==minb||j==maxb || j==b1||j==b2|| j==b3||j==b4)R(i,j,1)= 255;R(i,j,2)= 0;R(i,j,3)= 0;elseif(i == mina ||i == maxa||i ==a1 || i ==a2 || i ==a3 || i ==a4|| i ==a5 || i ==a6 || i ==a7)&&(j>minb && j<maxb)R(i,j,1)= 255;R(i,j,2)= 0;R(i,j,3)= 0;elseR(i,j,1)= I(i,j,1);R(i,j,2)= I(i,j,2);R(i,j,3)= I(i,j,3);endend
end

4ecc2e3800d33212bf379d11c030f744.png

图4 MXN维字符5

第三步:统计特征信息。

for i=1:COLfor j=1:ROWif(i > mina &&i < a1 && j>minb && j<b1)&& Ib(i,j)==0x11 =x11+1;elseif(i > a1 &&i < a2 && j>minb && j<b1)&& Ib(i,j)==0x12 =x12+1;elseif(i > a2 &&i < a3 && j>minb && j<b1)&& Ib(i,j)==0x13 =x13+1;elseif(i > a3 &&i < a4 && j>minb && j<b1)&& Ib(i,j)==0x14 =x14+1;elseif(i > a4 &&i < a5 && j>minb && j<b1)&& Ib(i,j)==0x15 =x15+1;elseif(i > a5 &&i < a6 && j>minb && j<b1)&& Ib(i,j)==0x16 =x16+1;elseif(i > a6 &&i < a7 && j>minb && j<b1)&& Ib(i,j)==0x17 =x17+1;elseif(i > a7 &&i < maxa && j>minb && j<b1)&& Ib(i,j)==0x18 =x18+1;endend
End
if(x11/y>0.5)y11 =0;
else y11 =1;
end
result =[y11,y21,y31,y41,y51;y12,y22,y32,y42,y52;y13,y23,y33,y43,y53;y14,y24,y34,y44,y54;y15,y25,y35,y45,y55;y16,y26,y36,y46,y56;y17,y27,y37,y47,y57;y18,y28,y38,y48,y58];

2118f22a858482f2d1c0d48de6f88e36.png

图5 字符5 特征信息

第四步:与模板匹配识别。

match5 =[0,0,0,0,1;0,1,1,1,1;0,1,1,1,1;0,0,0,0,1;1,1,1,1,0;1,1,1,1,0;1,1,1,1,0;0,0,0,0,1];if(result == match0)display(0);
elseif(result == match1)display(1);
elseif(result == match2)display(2);
elseif(result == match3)display(3);
elseif(result == match4)display(4);
elseif(result == match5)display(5);
elseif(result == match6)display(6);
elseif(result == match7)display(7);
elseif(result == match8)display(8);
elseif(result == match9)display(9);
elseif(result == matchA)display('A');
elseif(result == matchB)display('B');
elsedisplay('NO MATCH');
End

84ef7d5fc47dda0bd1ea4a5403545755.png

图6 字符5识别成功

其他字符展示

94f041d0a1653427da87500586036791.png

图7 字符9识别过程

b78f5d6b6b4adca1546181162cdbf05c.png

图8 字符9识别结果

fedd251a6bf9c0bc48e5ea3341b1b5ce.png

图9 字符A识别过程

de628e82068b6cc9996c41aa73b784da.png

图10 字符A识别结果

总结:相比较之前的特征线法,MXN维法识别准确率提高了很多,并且可以去识别字母、汉字、简单图形等。这为我们的车牌识别提供了一个理论基础和一种算法思想。对于更复杂的图案我们可以增加维数来进行更准确地识别。

4 FPGA实现MXN维字符识别框架介绍

9d5cc460f886b6ff22e14016bfcbd375.png

图11 FPGA实现MXN维字符识别模块图

如上图11所示,FPGA要处理的图像从HDMI_IN输入到FPGA内部,最后再由HDMI_OUT输出到显示器上,由串口将识别到的字符打印的串口工具上。

  1. rgb2gray:完成rgb彩色图像转灰度图像,算法采用(R+G+B)/3。
  2. Threshold_binary:完成灰度图像二值化,采用单峰。
  3. HVcount:图像行列计数,为了之后的边界查找。
  4. VP_one:完成目标字符的边界计算,采用水平和垂直投影算法。
  5. character_Statistics:完成MXN维的字符特征信息统计。
  6. Char_match:采用模板匹配的方法完成正确字符的识别。

5 字符模板以及训练过程

下图为用于训练的部分字符模板。

d265d26374287b021b9491afa714048a.png

训练过程

80990a9920db75ebaa63a0c5ac0097f5.png
fpga字符识别https://www.zhihu.com/video/1216312071018713088

6 FPGA实现板卡

本工程实现采用xilinx Z7芯片,板卡如下图所示。

f2805ce3386c90fa54ee75589ed059a8.png

本实验训练过程采用fpga内部产生字符方式进行训练。

对于摄像头采集的也需要进行训练后方可识别目标字符。

7 FPGA内部ila抓取结果

b54269805194c075f9ebee1ceb9c5008.png

字符‘C’的识别结果和统计结果

b3af8ebeedd534893b6771c20177d9fc.png

字符‘2’的识别结果和统计结果

e2954fac74510067259ee449769aa509.png

字符6的识别结果和统计结果

717984590545f7747f3c4c6abecc03a3.png

字符‘A’的识别结果和统计结果

bf864868f0a2778f9b2267f26352f66a.png

字符‘Z’的识别结果和统计结果

8 应用展望

在对数字0-9和字幕A-Z的识别后我们还做了汉字的识别,依然可以轻松的识别汉字。这意味着利用此方法可以轻松地完成车牌识别和一些交通号牌和简单图案的区分和识别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中

我真的很想有一个快速便捷的方法来遍历JSON中的多个记录&#xff0c;每个记录都有潜在的深层嵌套。我只想输出到表。我不确定$ .each()或$ .ajax()成功的javascript方法需要通过function()传递哪些参数。所有示例似乎都使用通用词“data”或“ obj”&#xff0c;但它们使我感到…

难题:嵌套computeIfAbsent

总览 Java 8库在地图上有一个新方法&#xff0c;computeIfAbsent。 这是一种非常有用的将地图变成与键关联的对象的缓存的方法。 但是&#xff0c;您可能没有考虑过一种组合。 如果您在内部调用computeIfAbsent会发生什么。 map.computeIfAbsent(Key.Hello, s -> {map.com…

python扩展文件_1. 使用 C 或 C++ 扩展 Python

1.12.给扩展模块提供C API很多扩展模块提供了新的函数和类型供Python使用&#xff0c;但有时扩展模块里的代码也可以被其他扩展模块使用。例如&#xff0c;一个扩展模块可以实现一个类型 "collection" 看起来是没有顺序的。就像是Python列表类型&#xff0c;拥有C AP…

swal ajax,Sweetalert详细介绍

好长时间没有更新文章了&#xff0c;年底工作比较忙&#xff0c;确实是没有时间来写文章。今天忙里偷闲&#xff0c;总结了一款前端提示框的插件——sweetalert——推荐给大家。Sweetalert安装Sweetalert官方为我们提供了三种安装方式&#xff1a;方法一 通过bower安装$ bower …

构造函数必须没有代码

构造函数中应完成多少工作&#xff1f; 在构造函数内部进行一些计算然后封装结果似乎是合理的。 这样&#xff0c;当对象方法需要结果时&#xff0c;我们将准备好它们。 听起来是个好方法&#xff1f; 不&#xff0c;这不对。 这是一个坏主意&#xff0c;原因有一个&#xff1a…

一个路由器两个网段互通_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...

前几天咱们了解&#xff1a;三种方法告诉你项目超过255个摄像机怎么设置IP?什么是公网ip&#xff1f;什么又是内网ip&#xff1f;为什么ip地址通常以192.168开头&#xff1f;也学习了&#xff1a;二、三层交换机与路由器的区别&#xff01;但是有好多人对IP这个概念还是不太清…

服务器appcrash的问题怎么修复,win7的ie出现APPCRASH问题怎么处理?

问题事件名称: APPCRASH 怎么解决?这是Win7或者是Vista特有的一个棘手的问题.APPCRASH(app是程序的意思&#xff0c;crash是坠机的意思。就是程序崩溃了/程序撞车……)(APPCRASH是Win7和Vista中特有的故障&#xff0c;就是程序崩溃引起APPCRASH错误的问题很多 如dll加载错误 软…

Jira 随便总结

一、JIRA与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 JIRA创建的问题类型包括New Feature、Bug、Task和Improvement四种&#xff0c;还可以自己定义&#xff0c;所以它也一是过程管理系统。 JIR…

http 路径 |_HTTP 请求與响应的格式及 curl 命令使用

介绍 HTTP&#xff0c;主要内容有HTTP 请求包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 请求内容HTTP 响应包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 响应内容如何使用 curl 命令HTTP 请求的格式1 动词 路径 协议/版本 2 Key1: value1 2 Key2: v…

A new start!

从今天起&#xff0c;开始每天晚上拿出来半个小时到一个小时的时间来总结今天我做的那些事情&#xff0c;有哪些进步&#xff0c;有哪些不足&#xff0c;有哪些心得和笔记。 以前的学习都是每天学完就往脑袋后面一放&#xff0c;导致很多东西当时学会了&#xff0c;但是后面就都…

华为y7可以人脸识别吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...

众所周知&#xff0c;无论是手机&#xff0c;还是电脑&#xff0c;我们所使用的系统到了一定的时间&#xff0c;都会进行“系统更新”&#xff0c;尤其是我们使用的苹果手机、华为手机等&#xff0c;就经常会跳出提示&#xff0c;提醒用户“更新系统”&#xff0c;尤其是当我们…

Apache骆驼丝攻示例

如果您想监视&#xff0c;调试&#xff0c;排除流经路由的消息&#xff0c;而又不必从通道中永久消耗消息&#xff0c;那么就需要使用电线 。 有线分流器充当接收者列表&#xff0c;该列表消耗输入通道之外的消息并将其发布到两个输出通道。 第一个是作为主要信道的实际目的地…

微软的翻译书签

http://labs.microsofttranslator.com/bookmarklet/1.选择语言; 2.添加 Translate 链接到收藏夹或书签. 转载于:https://www.cnblogs.com/del/p/3391181.html

参考文献中会议名称怎么缩写_期刊缩写查询总结

介绍英文论文写作中&#xff0c;经常会插入参考文献。那么参考文献中的期刊名称&#xff0c;时常需要使用缩写。但是有时候&#xff0c;查了半天&#xff0c;怎么也查不着&#xff0c;让人抓狂。今天小编总结了几个查询期刊缩写的网址&#xff0c;方便大家进行期刊缩写的查询。…

ET的异常翻译

前段时间&#xff0c;我写了一篇有关用AspectJ进行异常转换的小博客文章。 在此博客文章中&#xff0c;我们将看到如何使用ET及其较轻的Java 8方法来完成相同的任务。 动机 异常转换&#xff08;或异常转换&#xff09;是将一种类型的异常转换为另一种类型的过程。 转换异常的…

7. SVM松弛变量

我们之前讨论的情况都是建立在样例线性可分的假设上&#xff0c;当样例线性不可分时&#xff0c;我们可以尝试使用核函数来将特征映射到高维&#xff0c;这样很可能就可分了。然而&#xff0c;映射后我们也不能100%保证可分。那怎么办呢&#xff0c;我们需要将模型进行调整&…

mysql 8.0认证失败_解决mysql8.0因密码认证插件导致的链接不上

简介今天在迁移zabbix的数据库&#xff0c;每次链接到自己的mysql都报错&#xff0c;mysqlAuthentication plugin caching_sha2_password cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_passwordzabbix总是提示**** MySQL server is not available. Waiting 5 secon…

关于Servlet和异步Servlet

Servlet API是Java EE标准的一部分&#xff0c;自1998年正式发布2.1规范以来&#xff0c;一直是基于Java的企业体系结构的重要组成部分。 它是一种自以为是的API&#xff0c;用于服务围绕一些基本概念构建的请求/响应协议&#xff1a; 兼容的容器 &#xff0c;这是一个专用的…

linux c++ 运行时报 段错误 的一个原因

很长时间没有写 c/c了 这次依据一些代码写了一个linux上的小东西&#xff0c;结果在运行时用new 创建对象的时候&#xff0c;报: 段错误 有可能还出现如下报错信息: *** glibc detected *** ./selectServer: malloc(): memory corruption: 0x0000000000fba740 *** 研究了一会儿…

mysql主键和聚簇索引_[MySQL] innoDB引擎的主键与聚簇索引

mysql的innodb引擎本身存储的形式就必须是聚簇索引的形式 , 在磁盘上树状存储的 , 但是不一定是根据主键聚簇的 , 有三种情形:1. 有主键的情况下 , 主键就是聚簇索引2. 没有主键的情况下 , 第一个非空null的唯一索引就是聚簇索引3. 如果上面都没有 , 那么就是有一个隐藏的row-i…