基于FPGA的数字识别实现

前言

数字识别在我们生活中很常见,比如车牌识别。本篇博客就将介绍数字识别的方法,由于只是研究数字识别的方法,我们就不用硬件平台,而是用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:row
	for j=1:1:col
		if(j==col)
			if(x(i,j)>100)%判断阈值,将灰度图进行二值化
				fprintf(fid,'%02d\n',255);
			else
				fprintf(fid,'%02d\n',0);
			end
		else
			if(x(i,j)>100)%判断阈值,将灰度图进行二值?
				fprintf(fid,'%02d\t',255);
			else 
				fprintf(fid,'%02d\t',0);
			end
		end
	end
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:row
	for j=1:1:col
		if(j==col)
			fprintf(fid1,'%02x\n',aa((i-1)*col+j));
		else
			fprintf(fid1,'%02x\t',aa((i-1)*col+j));
		end
	end
end
for i=1:1:row
	for j=1:1:col
		if(j==col)
			fprintf(fid1_dec,'%d\n',aa((i-1)*col+j));
		else
			fprintf(fid1_dec,'%d\t',aa((i-1)*col+j));
		end
	end
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仿真,实现了静态数字的识别,最终仿真验证成功。并且摆脱了硬件的限制,在无硬件的条件下,我们仍然可以进行图像处理相关的学习。如果读者想要在硬件上验证,只需要对程序做稍微简单的修改即可,识别原理是一样的。花了一个下午写这一篇长博客,希望能起到抛砖引玉的作用,若有错误的地方,烦请指出,一起学习,一起进步!

  • 19
    点赞
  • 160
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值