基于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. python装饰器实例-Python装饰器简单用法实例小结
  2. .net通过获取客户端IP地址反查出用户的计算机名
  3. python输入字符串从大到小排列_567. 字符串的排列(Python)
  4. Linux各发行版本之间的比较
  5. DCMTK:类DcmUnsigned64bitVeryLong的测试程序
  6. CF 1638 E. Colorful Operations set 区间平推
  7. Spring事务—方法调用事务回滚
  8. python使用turtle步骤_Python+turtle交互式绘图:可以用鼠标拖动的小海龟
  9. 超清晰的 DNS 原理入门指南 (资源)
  10. 【数据结构】线段树(interval tree)
  11. 微信小程序多次跳转后不能点_京东小程序 Taro 开发对比原生开发测评
  12. 企业级的Java快速开发平台,首选iMatrix平台。
  13. libtorrent源码分析(三)BT下载相关知识总结
  14. 国产游戏表 (来自游侠)
  15. 祝愿大家未来顺利平安
  16. Armbian bullseye 系统OMV 6.x安装分享
  17. Grad-CAM简介
  18. SiC弱修饰的Si二维纳米结构/具有类石墨烯结构的二维碳化物晶体Ti2C/氧化锌纳米结构场效应晶体管/硅烯、硼烯和CO分子晶体的MBE生长
  19. 十 LVS 负载均衡
  20. lnk1120如何解决_Linking a C++ DLL 引发LNK1120和LNK2019问题的解决方案

热门文章

  1. nodejs接收表单写入mysql_NodeJS提交表单存数据库(转)
  2. ajax默认什么方法,ajax设置默认值ajaxSetup()方法
  3. mysql 去掉默认约束_06. 默认约束-创建、添加和删除
  4. php 之 ajax,PHP之AJAX
  5. endnote文献顺序编号不对_把Endnote装进大脑:行走的文献管理者
  6. java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?
  7. jquery部分方法
  8. Mac入门--安装PHP扩展redis,swoole
  9. C++并发编程实战---阅读笔记
  10. OpenStack基础知识-virtualenv工具详解