前言

数字识别在我们生活中很常见,比如车牌识别。本篇博客就将介绍数字识别的方法,由于只是研究数字识别的方法,我们就不用硬件平台,而是用Modelsim和Matlab来仿真验证。
具体方法如下:

  1. 我们用画图软件将带有数字的图片截取为640x480像素,为了和我们将来要使用的摄像头的分辨率一样。
  2. 利用Matlab将图片读取出来,生成一个txt文档
  3. 用Modelsim读取第二步生成的txt文档,做为数据源。然后做二值化,二值化后的数据只有8‘hff和8’h00两种,8’hff是背景色,8’h00是数字的数据。具体识别过程后面代码具体分析。

准备工作

  1. 带数字的图片(640x480)
  2. Matlab软件
  3. Modelism软件

数字识别原理介绍

代码为本博客作者原创,识别原理借鉴lee神博客。为了对原创作者的付出表示感谢,特分享数字识别原文链接:
https://www.cnblogs.com/leegod/p/8929678.html
1.1基于FPGA的数字识别的方法

通常,针对印刷体数字识别使用的算法有:基于模版匹配的识别方法、基于BP 神经网络的识别方法、基于数字特征的识别方法等。下文将对这几种算法进行讨论以及比较。
1>模版匹配法
模版匹配法是一种被较早应用的数字识别算法,该算法的关键是对所要识别
的所有数字进行模版构建,之后将图像中的数字与所有的数字模版一一进行比较,
计算出图像中数字与每个模版的相似度,根据所计算出的相似度结果进行识别。
其中相似度最高的模版即为我们所要识别的结果。模版匹配法的对数字的大小、
结构形状的规范化程度要求很高,数字的规范化程度对识别的准确率有着直接的
影响。该算法原理较为简单,但计算复杂度过大,同时不利于 FPGA 的实现。
2>神经网络识别算法
神经网络识别的方法是模仿动物神经网络的特征,对信息进行分布式并行处
理的一种算法。神经网络识别算法具有一定的抗干扰能力,但为了保证识别的准
确率,该算法需要负责并且大量的计算,来对神经网络进行训练,而过于复杂的
计算不利于 FPGA 对该算法的实现。
3>数字特征识别算法
基于数字特征的识别算法其核心是通过对数字的形状以及结构等几何特征
进行分析与统计,通过对数字特征的识别从而达到对图像中数字的识别。

1.2 基于数字特征算法实现数字识别

我们采用基于数字特征的算法进行数字的识别,通过图像采集模块采集到图像,进行灰度化,二值化,然后进行数字特征的提取和统计来完成对数字的识别,最终显示到数码管上,完成图像信息到数字信息的转化。

图1 0-6 数字特征标线

图2 7-9 数字特征标线

图3 5数字特征

数字特征信息的提取基于打印体,如上图1,图2,图3所示,以图3数字5举例,红框是数字5的水平和竖直的上下左右边界。X1在竖直方向的2/5处的水平线,x2在竖直方向的2/3处的水平线,y在水平方的1/2处的水直线。我们以此特征来统计x1,x2,y与数字5的交叉点。

以交叉统计法来区分0-9数字的特征如下表1:
表1 0-9数字特征统计表


由于2,3,5的数字特征统计表一样,无法区分所以我们继续增加数字特征以区分2,3,5。如表2:
表2 2,3,5 数字特征统计

这样通过数字统计完全区分开数字0-9。然后利用FPGA系统搭建实时数字识别系统。

Matlab主要程序分析

本项目,我们以识别数字2为例,原始图片如下:

im1=imread('D:\work\XYUE\zhuanti\IMAGE_PROCESS\Number_shi\Matlab\2.png'); %读取图片
x=rgb2gray(im1);%将原图转为灰度图
imshow(im1);%显示原图
imshow(x);%显示灰度图

fid=fopen('Num_dec.txt','wt');%需要生成10进制的数据文件,Matalb才能正确识别
fid_hex=fopen('Num_hex.txt','wt');%需要生成16进制的数据文件,Modelsim才能正确识别
[row,col]=size(x);
for i=1:1:rowfor j=1:1:colif(j==col)if(x(i,j)>100)%判断阈值,将灰度图进行二值化fprintf(fid,'%02d\n',255);elsefprintf(fid,'%02d\n',0);endelseif(x(i,j)>100)%判断阈值,将灰度图进行二值?fprintf(fid,'%02d\t',255);else fprintf(fid,'%02d\t',0);endendend
end
aa=textread('Num_dec.txt');
imshow(aa);%显示二值化后的图片
%%%将modelsim仿真生成的带边界的数据文件转换成640x480矩阵,并将其显示出来
aa=textread('D:\work\XYUE\zhuanti\IMAGE_PROCESS\Number_shi\FPGA\Sim\do\FPGA_MID_307200.txt');
fid1=fopen('Num_hex_bianjie.txt','wt');
fid1_dec=fopen('Num_dec_bianjie.txt','wt');
row=480;
col=640;
for i=1:1:rowfor j=1:1:colif(j==col)fprintf(fid1,'%02x\n',aa((i-1)*col+j));elsefprintf(fid1,'%02x\t',aa((i-1)*col+j));endend
end
for i=1:1:rowfor j=1:1:colif(j==col)fprintf(fid1_dec,'%d\n',aa((i-1)*col+j));elsefprintf(fid1_dec,'%d\t',aa((i-1)*col+j));endend
end
aa=textread('Num_dec_bianjie.txt');
imshow(aa,[]);%注意要加[],否则matlab没办法按数据等级来显示颜色,造成的结果是看不到边框

Matlab效果图片显示

FPGA主要模块思路分析

FPGA部份主要分为以下几个主要模块:

模块一


该模块主要读取matlab生成的图片数据,接口定义见图上说明

模块二


边界检测原理分析:背景数据为8’hff,数字数据为8’h00,所以如果检测到数据由8’hff变为00,那说明检测到了左边界,由于数字中间有镂空,所以我们会检测到很多左边界,这时就要做一个大小比较,当得到的所有左边界中最小的那个数,便是我们数字的左边界坐标,其余坐标检测与之类似。具体代码如下:


模块三


边界显示的原理分析:边界检测模块检测出了上下左右的坐标,当行数计数到上边界时,同时列计数在左右边界之间时,将该行的图像数据替换为边界数据(8’h55)。其实边界与上边界处理方法类似。具体代码如下:

模块四



识别原理简单图示:

模块五

FPGA仿真波形分析


从上面的仿真图中,我们最后识别出了图片中的数字,num=2。

结语

该项目,我们通过Matlab结合FPGA仿真,实现了静态数字的识别,最终仿真验证成功。并且摆脱了硬件的限制,在无硬件的条件下,我们仍然可以进行图像处理相关的学习。如果读者想要在硬件上验证,只需要对程序做稍微简单的修改即可,识别原理是一样的。花了一个下午写这一篇长博客,希望能起到抛砖引玉的作用,若有错误的地方,烦请指出,一起学习,一起进步!

基于FPGA的数字识别实现相关推荐

  1. 基于FPGA的数字识别的实现

    基于FPGA的数字识别的实现 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版匹配的识别方法.基于BP 神经网络的识别方法.基于数字特征的识别方法等.下 ...

  2. 基于 FPGA 的数字抢答器设计

    下面是基于 FPGA 的数字抢答器设计,在quartusII下,modelsim下仿真,编程语言VHDL.   1.抢答器的工作原理 主持人宣布可以抢答后,在 20s 的定时时间内若有人按键抢答,则这 ...

  3. [FPGA]基于FPGA的数字跑表

    基于FPGA的数字跑表的设计与实现 一.设计要求 用FPGA设计并实现一个数字跑表,范围为0~59分59.99秒.可以实现数字跑表进行启动.停止计时和显示读数三个操作,可以在数码管上显示读数. 二.设 ...

  4. 基于FPGA的数字时钟设计

    基于FPGA的数字时钟设计 芯片与开发板 技术指标 1.具有正常的日时分秒技术显示功能,用七个数码管分别显示日,时,分,秒. 2.有按键校日,校时,校分,校秒. 3.利用led模拟整点报时功能. 4. ...

  5. 基于MATLAB手写体数字识别程序设计

    基于MATLAB手写体数字识别程序设计 手写体识别由于其实用性,一直处于研究进步的阶段,本文主要针对的是对0-9十个手写数字体脱机识别,在Matlab中对样本部分为进行16特征的提取,分别采用最小距离 ...

  6. 基于FPGA的火焰识别系统开发——简化版

    基于FPGA的火焰识别系统开发的详细版欢迎订阅本博: https://blog.csdn.net/ccsss22/article/details/115406504 1.问题描述:         传 ...

  7. 基于FPGA的数字钟(四)——时钟控制模块

    一.需求分析 时钟控制模块,需要生成秒,分,时三路信号,需要有外部信号能对其进行控制. 按照正常时钟逻辑: 秒满60归零: 分在秒满60时进1,分满60归零: 时在分满60时进1,时满24归零. 外部 ...

  8. 基于FPGA的数字钟——(三)时钟显示模块(数码管)

    基于FPGA的数字钟--(三)数码管显示模块 一.硬件原理 本设计中使用 6 个共阳数码管,可以显示 6 个数字(包含小数点) .电路用 PNP管来反向驱动并且控制列扫描信号来选择哪个数码管.而且所有 ...

  9. 基于pynq的数字识别神经网络加速器设计

    文章目录 基于pynq的数字识别神经网络加速器设计 软件部分 1. 全连接神经网络: 2. 卷积神经网络搭建: 3. 文件格式转换: 硬件部分 1. MNIST的硬件实现思路 2. 代码编写与硬件综合 ...

最新文章

  1. 《互联网运营智慧》进展
  2. cla作用matlab,共轭亚油酸(CLA)怎么吃?共轭亚油酸副作用
  3. 数据中心供配电系统负荷计算实例分析
  4. SAP销售和财务数据库表之间的关系
  5. hql与sql的区别
  6. Shiro和SpringBoot简单集成
  7. Linux配置IP常用命令
  8. python输入数据爬取_python根据用户需求输入想爬取的内容及页数爬取图片方法详解...
  9. 2017西安交大ACM小学期数论 [水题]
  10. case函数,replace函数
  11. mysql loader_Mysql的批量导入类 MySqlBulkLoader
  12. 分子动力学模拟需要掌握的理论、语言和软件
  13. android 自定义取色器,Android Studio设置颜色拾色器工具Color Picker教程
  14. 支付宝登录java_支付宝开发平台之第三方授权登录与获取用户信息
  15. 485集线器,485Hub、485分配器、485共享器、三级浪涌保护,485星型接法设备 1拖4...
  16. STM32f107 CAN滤波器设置
  17. jquery实现歌词滚动
  18. Fofa 下载与使用 网络空间搜索引擎
  19. 全球与中国pH复合电极市场深度研究分析报告
  20. 【C语言答案】第七次练习---二维数组简单函数

热门文章

  1. Android桌面悬浮窗口举例
  2. 北斗定位,定位追踪,防盗追踪系统设计方案
  3. 收藏了800道Java后端经典面试题,共享给大家
  4. java引_JAVA中的引用
  5. SQL server登录密码重置(忘记密码)
  6. Dreamweaver CS6实战手册
  7. 基于Vue+Element Plus实现快速导航
  8. 形状因子对禁带的调控
  9. [转][火星帖][留档] 东京秋叶原电器街世风日下
  10. android 微信 https 证书,微信https未授权证书究竟是什么意思