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

1 概述

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

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

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

图1 识别过程

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

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

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

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

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

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

图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

图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

图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];

图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

图6 字符5识别成功

其他字符展示

图7 字符9识别过程

图8 字符9识别结果

图9 字符A识别过程

图10 字符A识别结果

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

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

图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 字符模板以及训练过程

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

训练过程

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

6 FPGA实现板卡

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

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

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

7 FPGA内部ila抓取结果

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

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

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

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

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

8 应用展望

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

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

  1. matlab基于dct的图像压缩编码解码_基于FPGA的扩频系统设计(下)

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  2. altera fpga 型号说明_基于FPGA的USB2.0接口通信

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 概述 本文主要介绍一种基于FPGA的FT232H接口通信开发方案.传统的USB通信开发对工程人员 ...

  3. 人工智能在fpga的具体应用_“基于FPGA的人工智能应用技术师资培训”圆满落幕!...

    "基于FPGA的人工智能应用技术师资培训"在英特尔® FPGA中国创新中心圆满落幕. 2019年12月15日,"基于FPGA的人工智能应用技术师资培训"在英特尔 ...

  4. fir数字滤波器设计与软件实现_基于FPGA低通滤波器的FIR的设计

    基于FPGA低通滤波器FIR的设计 1 滤波器的特征参数介绍 图1 低通滤波器特征参数如图1所示,低通滤波器的通带截止频率为ωp ,通带容限为α1,阻带截止频率为ωs,阻带容限为α2.通带定义为|ω| ...

  5. lms算法的verilog实现_基于FPGA和LMS算法的系统建模

    © 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.    http://www.c ...

  6. python百度云ocr文字识别软件_基于百度云的OCR识别(Python)

    2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上. 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊 ...

  7. 小数分频器vhdl实现_基于FPGA的小数分频器的设计与实现.doc

    基于FPGA的小数分频器的设计与实现.doc 基于FPGA的小数分频器的设计与实现 [摘要]本文首先分析了现有小数分频器的优缺点,在此基础上提出了一种改进型小数分频器的设计方法.同时结合VHDL文本输 ...

  8. 多通路fpga 通信_基于FPGA的多路卫星信号处理系统的设计实现

    龙源期刊网 http://www.qikan.com.cn 基于 FPGA 的多路卫星信号处理系统的设 计实现 作者:曹晨 唐灵丽 来源:<中国新通信> 2014 年第 02 期 [摘要] ...

  9. verilog 算法加速模块设计流程_基于FPGA的图像加速器的设计

    基于 FPGA 的图像加速器的设计 摘 要 介绍了一种基于 FPGA 的图像加速器的设计.本文硬件加速器的实质是通过流水线 设计来减少多余的操作达到加速的目的的, 内存是由 DMA 控制器访问, 之后 ...

最新文章

  1. uscao Spinning Wheels
  2. USTC并行计算复习
  3. xcode打包(Archive)显示Command /usr/bin/codesign failed
  4. Jmeter 多台机器产生负载及问题解决方法
  5. Web性能API——帮你分析Web前端性能
  6. go post 参数_go语言实现网易云音乐爬虫
  7. (五):C++分布式实时应用框架——微服务架构的演进
  8. 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable...
  9. 超图Cesium鼠标事件处理
  10. “请给我一个女朋友”“我给你一个大嘴巴子”,微信官方真给人实现愿望了...
  11. 3种重构EF Linq查询的方法而不扼杀性能
  12. LINUX SAN 500G重新分区、格式化,后成功恢复数据90%
  13. Kafka Producer生产者原理
  14. PowerShell在Exchange2010下快速开启邮箱[续]
  15. 苹果登陆qq邮箱服务器,腾讯QQ邮箱配置,在苹果邮件配置和第三方spark登录qq邮箱账号...
  16. 如何一站式高效管理固定资产?
  17. keil:官网下载安装MDK5的软件包
  18. 远程控制家里电脑的N种方案
  19. Struts原理与实践(7)
  20. TM4C123G学习笔记(1)——配置Keil开发环境(TM4C123G+Keil)

热门文章

  1. 零空间,Markov‘s inequality, Chebyshev Chernoff Bound, Union Bound
  2. Java面向对象(12)--对象类型转换 (Casting )
  3. 分布式部署_业务模块化打造单体和分布式部署同步支持方案
  4. 2020-08-14 光纤通信第三章知识点整理
  5. html按钮返回上一步操作,用js实现返回上一步操作
  6. springboot与任务(邮件任务)
  7. Java 中Thread的sleep、join、yield方法解析
  8. 数据库Mysql的学习(六)-子查询和多表操作
  9. Spark面对OOM问题的解决方法及优化总结 (转载)
  10. phoengap–node+websocket在线聊天室