基于FPGA的数字识别的实现
欢迎大家关注我的微信公众号:FPGA开源工作室
基于FPGA的数字识别的实现二
作者:lee神
1 背景知识
1.1基于FPGA的数字识别的方法
通常,针对印刷体数字识别使用的算法有:基于模版匹配的识别方法、基于BP 神经网络的识别方法、基于数字特征的识别方法等。下文将对这几种算法进行讨论以及比较。
1>模版匹配法
模版匹配法是一种被较早应用的数字识别算法,该算法的关键是对所要识别
的所有数字进行模版构建,之后将图像中的数字与所有的数字模版一一进行比较,
计算出图像中数字与每个模版的相似度,根据所计算出的相似度结果进行识别。
其中相似度最高的模版即为我们所要识别的结果。模版匹配法的对数字的大小、
结构形状的规范化程度要求很高,数字的规范化程度对识别的准确率有着直接的
影响。该算法原理较为简单,但计算复杂度过大,同时不利于 FPGA 的实现。
2>神经网络识别算法
神经网络识别的方法是模仿动物神经网络的特征,对信息进行分布式并行处
理的一种算法。神经网络识别算法具有一定的抗干扰能力,但为了保证识别的准
确率,该算法需要负责并且大量的计算,来对神经网络进行训练,而过于复杂的
计算不利于 FPGA 对该算法的实现。
3>数字特征识别算法
基于数字特征的识别算法其核心是通过对数字的形状以及结构等几何特征
进行分析与统计,通过对数字特征的识别从而达到对图像中数字的识别。
1.2 基于数字特征算法实现数字识别
我们采用基于数字特征的算法进行数字的识别,通过图像采集模块采集到图像,进行灰度化,二值化,然后进行数字特征的提取和统计来完成对数字的识别,最终显示到数码管上,完成图像信息到数字信息的转化。
图1 0-6 数字特征标线
图2 7-8 数字特征标线
图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数字特征统计表
数字 |
与y交叉点个数 |
与x1交叉点个数 |
与x2交叉点个数 |
分类 |
0 |
2 |
2 |
2 |
A |
1 |
1 |
1 |
1 |
B |
2 |
3 |
1 |
1 |
C |
3 |
3 |
1 |
1 |
C |
4 |
2 |
2 |
1 |
D |
5 |
3 |
1 |
1 |
C |
6 |
3 |
1 |
2 |
E |
7 |
2 |
1 |
1 |
F |
8 |
3 |
2 |
2 |
G |
9 |
3 |
2 |
1 |
H |
由于2,3,5的数字特征统计表一样,无法区分所以我们继续增加数字特征以区分2,3,5。如表2:
表2 2,3,5 数字特征统计
数字 |
与x1的交叉点位置(左,右) |
与x2的交叉点位置(左,右) |
分类 |
2 |
右 |
左 |
I(C) |
3 |
右 |
右 |
J(C) |
5 |
左 |
右 |
K(C) |
这样通过数字统计完全区分开数字0-9。然后利用FPGA系统搭建实时数字识别系统。
如图4所示,交通摄像头对公路上移动的汽车进行实时的定位,随着小汽车的移动,红色框也跟随小汽车移动,实时将小汽车框起来。
1.3 目标跟踪方法
基于实时物体移动的静态图像背景中移动目标检测是计算机视觉领域的研究热点,在安防、监控、智能交通、机器智慧、以及军事领域等社会生活和军事防御等诸多领域都有较大的实用价值。移动目标检测的实质是从实时图像序列中将图像的变化区域从整体图像中分割提取出来。由于图像的后期处理,比如移动目标的分类、跟踪、测距、判断大小以及行为动作分析等,主要考虑的是移动目标区域的像素信息,所以对移动目标的准确检测和有效分割是整个检测跟踪系统的重要基础。
图4 公路上的运动汽车
目前逐渐形成三种运动目标的检测算法:
1)帧间差分法 是采用视频序列中的相邻两帧图像做差的方法,来检测视频序列中的移动目标。但是受运动目标和背景变化的影响,检测过程中有可能出现伪目标或者目标中出现“空洞”,在目标运动不是太快时可以有效的检测到目标。
2)背景减除法首先在没有目标的场景中获取背景图像,然后利用实时视频序列和背景图像做差,来实现地移动目标的检测。如何获得背景是背景减除法的关键。
3)光流法是通过给图像中每个像素点赋予一个速度矢量的方法建立光流场,利用光流场中矢量运动的连续性来检测移动目标。该方法的计算量通常很大,难以实现实时性的检测。
本节将基于FPGA的目标跟踪以及统计学的特征统计来实现对数字的位置实时定位以及数字识别,不在局限于数字在屏幕中的位置,也不局限数字的大小。
2 基于FPGA的数字识别的实现
图5 基于ov5640的FPGA实时数字识别系统
如图5所示,我们图像采集使用 ov5640 cmos 500W像素摄像头,将采集到的彩色RGB图像首先存入SDRAM中,然后由TFT显示控制端读出图像数据,读出RGB图像数据后,我们首先进行RGB转Ycbcr算法操作,然后对灰度图像进行阈值分割,形成二值图像,对二值数字图像进行边界追踪的基础上进行数字识别,最终将边界显示在TFT5寸屏幕上,将识别的数字信息显示在数码管上。
图6 边界追踪数字识别的三大主要核心模块
如图6 所示,以TFT屏的显示时序为基准,首先进行边界追踪,识别数字边界后,我们在边界的基础上进行统计特征的数字识别。
图7 边界追踪模块
如图7 所示,hcount为列计数器,vcount为行计数器,TFT_VS_fall和TFT_VS_rise分别是帧下降沿标志和帧上升沿标志,frame_cnt为帧计数器,hcount_l和hcount_r分别是识别后数字的左右边界,vcount_l和vcount_r分别是数字的上下边界。Th_flag_fall和th_flag_rise分别是灰度图像阈值后的下降沿和上升沿标志。
图8 数字识别模块
如图8 所示基本的边界信息均来自数字边界识别模块,数字识别模块主要的到数字统计学的两横一竖(x1,x2,y)与数字的交点信息,以及其他补充信息。
部分核心代码:
/*
Module name: digital_recognition.v
Description: digital recognition
Data: 2018/04/17
Engineer: lipu
e-mail: 137194782@qq.com
微信公众号: FPGA开源工作室
*/
数字识别x1 ,x2,y核心代码:
TFT显示屏显示代码:
数字识别与数码管显示对接代码:
结果展示:
图9 实验原图
图10 边界跟踪数字识别6
图11 边界跟踪数字识别7
图12 边界跟踪数字识别4
图13 边界跟踪数字识别5
展望:
基于机器视觉的识别是走向人工智能的必然之路,字符的识别就是这条路的敲门砖。本次实验的结果完成了无论数字大小,数字在屏幕中的位置均可正确识别。基于此,可以开发人脸位置识别,人脸模板匹配识别,车牌识别等现如今比较火的机器视觉,人工智能等。
基于FPGA的数字识别的实现的更多相关文章
- 基于FPGA的肤色识别算法实现
大家好,给大家介绍一下,这是基于FPGA的肤色识别算法实现. 我们今天这篇文章有两个内容一是实现基于FPGA的彩色图片转灰度实现,然后在这个基础上实现基于FPGA的肤色检测算法实现. 将彩色图像转化为 ...
- FPGA经典:Verilog传奇与基于FPGA的数字图像处理原理及应用
一 简述 最近恶补基础知识,借了<<Verilog传奇>>,<基于FPGA的嵌入式图像处理系统设计>和<<基千FPGA的数字图像处理原理及应用>& ...
- 基于FPGA的数字秒表(数码管显示模块和按键消抖)实现
本文主要是学习按键消抖和数码管动态显示,秒表显示什么的,个人认为,拿FPGA做秒表真是嫌钱多. 感谢 感谢学校和至芯科技,笔者专业最近去北京至芯科技培训交流了一周.老师的经验还是可以的,优化了自己的代 ...
- 基于FPGA的RGB图像转灰度图像算法实现
一.前言 最近学习牟新刚编著<基于FPGA的数字图像处理原理及应用>的第六章直方图操作,由于需要将捕获的图像转换为灰度图像,因此在之前代码的基础上加入了RGB图像转灰度图像的算法实现. 2 ...
- 手写数字识别 ----在已经训练好的数据上根据28*28的图片获取识别概率(基于Tensorflow,Python)
通过: 手写数字识别 ----卷积神经网络模型官方案例详解(基于Tensorflow,Python) 手写数字识别 ----Softmax回归模型官方案例详解(基于Tensorflow,Pytho ...
- Java基于opencv实现图像数字识别(五)—投影法分割字符
Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...
- Java基于opencv实现图像数字识别(四)—图像降噪
Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...
- Java基于opencv实现图像数字识别(三)—灰度化和二值化
Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...
- Java基于opencv实现图像数字识别(二)—基本流程
Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...
随机推荐
- ll的命令后面的字段详解
linux学习 命令ll后字段的解释 分类:linux | 标签: 命令ll后字段的解释 2010-10-25 15:47阅读(4513)评论(0) ls -l 列表信息详解 我们平时用ls -l ...
- LeetCode & Q28-Implement strStr-Easy
String Two Pointers Description: Implement strStr(). Returns the index of the first occurrence of ne ...
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
- Linq 等式运算符:SequenceEqual
检查元素的数量,每个元素的值及两个集合中元素的顺序是否相等,3个方面都相等则为true,否则为false IList<string> strList1 = new List<stri ...
- MySQL中使用sql语句获得表结构
最近在研究PHP,那么就必须涉及到mysql.其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读取数据(因为人家刚刚新建,就是空的没有数据) 延伸出来便是直接查表结构获得字段名,再进行处 ...
- GIT入门笔记(10)- 多种撤销修改场景和对策
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步, ...
- 新概念英语(1-67)The weekend
新概念英语(1-67)The weekend What are the Johnsons going to do at the weekend? A:Hello. Were you at the bu ...
- OAuth2.0学习(1-12)开源的OAuth2.0项目和比较
OAuth2.0学习(2-1)OAuth的开源项目 1.开源项目列表 http://www.oschina.net/project/tag/307/oauth?lang=19&sort=t ...
- Tcl与Design Compiler (一)——前言
已经学习DC的使用有一段时间了,在学习期间,参考了一些书,写了一些总结.我也不把总结藏着掖着了,记录在博客园里面,一方面是记录自己的学习记录,另一方面是分享给大家,希望大家能够得到帮助.参考的书籍有很 ...
- 关于CORS跨域问题的理解
起因 因为这段时间一个项目前后端分别部署在不同服务器的需要,抽空学习了一下CORS问题,不足之处,欢迎指教. 什么是CORS CORS是一个w3c标准,全称是"跨域资源共享"(Cr ...