正点原子 发表于 2019-7-29 20:44:52

【正点原子FPGA连载】第五十三章 基于 OV5640 的数字识别实验--摘自【正点原子】开拓者 FPGA 开发指南

本帖最后由 正点原子 于 2020-10-24 15:09 编辑

1)实验平台:正点原子开拓者FPGA开发板
2)平台购买地址:https://item.taobao.com/item.htm?id=579749209820
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-281143-1-1.html
4)本实例源码下载:
5)对正点原子FPGA感兴趣的同学可以加群讨论:712557122点击加入:
6)关注正点原子公众号,获取最新资料更新


第五十三章 基于 OV5640 的数字识别实验

数字是人们日常生活中进行信息交流时不可缺少的信息载体, 面对大量的数字如何让机器识别处理, 包括身份证号识别、 车牌号识别等就成为了一个研究点, 同时, 数字识别必然涉及到图像处理, 本章我们通过数字特征识别入手对数字识别有一个基本的了解, 以及对数字图像
处理有一个基本的认识。 本章包括以下几个部分:
53.1 简介
53.2 实验任务
53.3 硬件设计
53.4 程序设计
53.5 下载验证
53.1 简介
数字识别一般通过特征匹配及特征判别的方法来进行处理, 前者一般适用于规范化的印刷体字符识别, 现今该技术基本成熟, 后者多用于手写字符识别, 其研究还处于探索阶段, 识别率还比较低。 本章我们通过对印刷体数字识别入手, 了解特征匹配识别的应用。
数字特征识别是通过对数字的形状以及结构等几何特征进行分析与统计, 通过对数字特征的匹配从而达到对图像中数字的识别, 如下图所示:


图 53.1.1 数字几何特征

x1、 x2是水平方向的两条直线, 与数字长度成特定比例关系, y是竖直方向的直线, 占数字宽度一半, 这三条线与数字的交点可以得到数字的特征值。 下面以数字0为例, 如下图所示:


图 53.1.2 数字0的几何特征

红框是数字的边界, x1取上下边界的2/5处, x2取上下边界的2/3处, y取左右边界的1/2,可以看到x1与数字0有两个交点, 左右(以y为分界) 各一个, x2同样与数字0有两个交点, 左右各一个, y与数字0有两个交点。 以此统计数字特征实现识别, 如下表所示:
表 53.1.1 数字特征表

53.2 实验任务
本章我们在开拓者FPGA开发板上实现数字识别, 利用4'3寸RGB屏显示OV5640摄像头捕获到的数字, 并将识别到的数字显示在数码管上。
53.3 硬件设计
本次实验用到了OV5640摄像头、 SDRAM、 4'3寸RGB TFT-LCD模块, 我们可以在“OV5640摄像头RGB TFT-LCD显示实验” 的基础上搭建本实验。
53.4 程序设计
根据实验任务, 我们设计如图 53.4.1所示的系统架构, OV5640摄像头采集到的数据通过写FIFO模块wrfifo写入SDRAM, 然后通过读FIFO模块读出, 读出的数据在LCD驱动模块的驱动下进入vip模块, 在vip模块内部图像数据先由rgb2ycbcr模块将RGB转化为YCbCr, 然后进行二值
化处理, 得到二值图像, 对二值图像进行水平垂直投影即图像分割, 得到各个数字的水平和垂直边界, 将数字边界信息送入特征识别模块进行特征匹配, 从而识别图像中的数字, 将识别到的数字送入数码管驱动模块显示在数码管上。 LCD显示器显示处理后的二值化图像和图像的边
界。


图 53.4.1 系统架构

了解了整个处理流程后, 我们来看一下底层硬件中各个模块的设计思路。 由于除vip模块之外的模块都在先前的实验中介绍过, 这里就不多做介绍。


图 53.4.2 vip模块接口定义


vip模块的输入端除了帧数据使能信号pre_frame_de、 帧行同步信号pre_frame_hsync、 帧场同步信号pre_frame_vsync外,还有位置坐标信号xpos和ypos和像素pre_rgb,这些信号由LCD驱动模块输入。 输出除了vip模块处理后的帧数据使能信号post_frame_de、 帧行同步信号
post_frame_hsync、 帧场同步信号post_frame_vsync外, 还有一个识别后的数字信号digit,由于开拓者开发板板载6位数码管, 每位数码管用压缩的8421BCD编码显示, 总共需要4*6=24位, 即digit信号位宽为24位, 该信号输出给数码管驱动模块在数码管上显示识别到的数字
vip模块有五个参数, 如下图所示:


图 53.4.3 vip模块的参数

NUM_ROW和NUM_COL分别指需识别的数字的行数和列数, 这里我们指定识别1行4列的数字;H_PIXEL和V_PIXEL是图像的水平和垂直像素大小, 因为在4'3寸RGB屏上显示, 其分辨率为480*272; DEPBIT是数据的位宽, 主要用于确定数字边界大小的位宽, 与水平和垂直像素大小
有关。vip模块是封装层模块, 是对图像处理子模块的顶层封装, 其内部模块如下图所示:


图 53.4.4 vip模块的子模块

rgb2ycbcr是RGB转YCbCr模块、 binarization是二值化模块、 projection是投影分割模块、digital recognition是特征匹配识别模块。 下面我们按照处理的先后顺序依次介绍各模块。1) rgb2ycbcr 模块
rgb2ycbcr模块实现RGB到YCbCr的转换, 模块接口如下图所示:


图 53.4.5 rgb2ycbcr模块接口定义

可以看到输入为rgb565, 输出为ycbcr, 内部进行rgb565到YCbCr的转换, 依据OV5640的官方手册, 转换公式如下:


图 53.4.6 RGB888转YCbCr

需要注意的是这里的RGB为RGB888, 所以我们需要将RGB565转换为RGB888。 可以采用高位填充低位的方式, 如下图所示:


图 53.4.7 RGB565转RGB888

只所以进行色彩空间的转换, 是因为后面我们需要根据亮度信息进二值化处理, 而YCbCr色彩空间的特点是将亮度和色度分离开, 从而适合于图像处理。 后面我们根据亮度信息Y进行二值化。
2) binarization 二值化模块binarization是二值化模块, 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来, 在很多情况下, 也是进行图像分析、 特征提取与模式识别之前的必要的图像预处理过程。
模块接口如下图所示:


图 53.4.8 binarization模块接口定义

根据输入的color转换为相应的二值化图像输出, 输出的monoc为像素的二值化后的信息,
1代表白色, 0代表黑色, monoc_fall是像素变化的标志信号, 即由1变为0。3) projection 投影分割模块projection是投影分割模块, 实现对二值化后的图像的水平垂直投影, 从而实现对图像的分割。 模块接口如下图所示:


图 53.4.9 projection模块接口定义


该 模 块 输 出 投 影 后 得 到 的 边 界 信 息 , row_border_data_rd 是 行 边 界 信 息 ,col_border_data_rd是列边界信息, 这些信息存放在自定义的ram里面


如下图所示:图 53.4.10 自定义存储边界信息的ram接口

当 外 面 模 块 需 要 读 取 边 界 信 息 时 , 只 需 要 通 过 给 定 地 址 row_border_addr_rd 和col_border_addr_rd就可得到边界地址信息, 需要说明的是对于row_border_addr_rd而言, 当row_border_addr_rd为0时存放的是行上边界信息, 为1时存放的是行下边界信息, 对于col_border_addr_rd, 当col_border_addr_rd为0时存放的数字的左列边界信息, 为1时存放的是右列边界信息。 num_col是采集到的数字列数, num_row是采集到的数字行数,project_done_flag是投影完成标志, 表明可以进行后期处理。4) digital recognition 特征匹配识别模块digital recognition是特征匹配识别模块, 根据投影分割模块对分割后的单个数字进行
特征匹配识别。 模块接口如下图所示:


图 53.4.11 digital recognition模块接口定义

该模块最主要的输出是识别到的数字digit和color_rgb, 可以看到这里的digit是16位的,这是因为我们识别的1行4列的数字,每个数字用压缩的8421BCD编码表示,需要4*4=16位,digit的位宽是自动匹配的, 不需要关心。 输出的color_rgb信息显示在RGB显示屏上, 为二值化后的
图像和图像中数字的边界。该模块主要用到我们在简介中介绍到的数字特征, 由于获取数字特征的x1和x2是边界的小数如2/5(0.4) 、 2/3(0.6667) , 而Verilog HDL不直接支持小数的使用, 所以需要对这些小数进行处理, FPGA中对于小数的处理通常有三种方法:
方法1: 将小数乘某个数(一般为2的指数) 得到一个整数, 再将乘积除以该整数, 一般通过移位实现除的效果, 如0.25, 乘以4得到1, 乘积右移2位(除以4) 即可, 我们在RGB转YCbCr时就用到了此方法;
方法2: 将小数进行定点化处理。 所谓的定点化就是人为的确定用多少位来表示小数, 即把1多少等分。 如果我们用6个位来表示小数, 相当于将1分成2^6=64等份, 每份为1/64=0.015625, 如果我们想用此表示2/5, 只需要知道2/5中有多少个1/64(0.015625) , 2/5除以
1/64为25.6, 约等于26, 26用二进制表示为011010, 所以2/5即0.4的6位定点化为011010。方法3: 使用IP核。 使用软件提供的处理浮点数的IP核或乘除IP核。识别数字的方法使用的是简介部分的数字特征表, 特征匹配的Verilog HDL实现如下:


图 53.4.12 特征匹配

介绍完了vip整个模块, 我们还需要对lcd驱动模块进行相应的修改, 关键的修改点如下:


图 53.4.13 修改lcd驱动模块

只所以需要修改是因为之前我们使用的是lcd _de信号, 现在我们需要使用lcd_hs和lcd_vs信号。
53.5 下载验证
首 先 我 们 打 开 数字识别工 程digital_recognition , 在 工 程 所 在 的 路 径下 打 开digital_recognition/par文件夹, 在里面找到“digital_recognition.qpf” 并双击打开。 注意工程所在的路径名只能由字母、 数字以及下划线组成, 不能出现中文、 空格以及特殊字符等。 工程打开后如下图所示:


图 53.5.1 数字识别实验工程

将下载器一端连电脑,另一端与开发板上对应端口连接,接上OV5640和4.3寸RGB显示屏后,连接电源线并打开电源开关。 接下来我们下载程序, 验证数字识别功能。工程打开后通过点击工具栏中的“Programmer” 图标打开下载界面, 通过“Add File” 按
钮选择digital_recognition /par/output_files目录下的“digital_recognition.sof”文件。在程序下载界面点击“Hardware Setup” , 在弹出的对话框中选择当前的硬件连接为“USB-Blaster” 。 然后点击“Start” 将工程编译完成后得到的sof文件下载到开发板中, 如图所示:


图 53.5.2 程序下载完成界面

下载完成后, 我们将下图中的数字图片合适的放在OV5640摄像头前面。


图 53.5.3 需识别的数字

从下图实验结果中我们可以看到RGB显示屏上显示出捕获到的数字, 并框出数字的边界,数码管显示2345。


图 53.5.4 实验结果

至此, 我们的数字识别实验就完成

041012js 发表于 2019-7-29 21:06:11

写得不错

Jmhh247 发表于 2019-7-30 09:42:37

请教原子大佬,LCD预览OV5640相机画面,能达到几帧,会有断层么?
页: [1]
查看完整版本: 【正点原子FPGA连载】第五十三章 基于 OV5640 的数字识别实验--摘自【正点原子】开拓者 FPGA 开发指南