基于STM32的嵌入式智能视觉数字识别实验装置
2021-06-02李华霖吴开志
李华霖, 肖 玮, 吴开志
(南昌航空大学 信息工程学院,南昌 330063)
引言
培养具有创新创业能力和跨界整合能力的新型技术人才是高校的重要任务。因此,需要对学生开展综合性实验教学,采取个性化、开放式的教学理念,实现不同课程之间的知识整合,有利于锻炼学生的动手能力、自学能力、思维能力和团队协作能力等[1-2]。
随着智能化设备的不断发展,基于数字图像处理的智能视觉识别系统逐渐引起广大研究者的关注[3]。目前,传统的图像数字识别装置大多采用基于嵌入式Linux或OCR技术实现,但实现的平台存在体积较大、价格昂贵、入手难度大等缺点[4],不易于学生学习开发。为此,自主开发了一种价格低廉、体积较小的数字识别实验装置,大大降低了学生开发学习的难度。可在该实验装置上,进行图像处理的相关教学,使学生们可以从实践中学习到图像处理的知识,激发学生们的热情和创新的能力[5]。
1 实验装置组成
1.1 实验装置硬件组成
实验装置包括图像的获取、字符的识别、结果显示、数据远程传输4个部分。实验装置硬件组成如图1所示,图像的获取采用OV2640模块,图像处理的核心模块为STM32单片机,显示模块为TFT-LCD屏,数据远程传输部分采用ESP8266-WiFi模块实现,可实时发送数据到手机App。摄像头获取图像,通过STM32单片机的DCMI接口,将采集的图像传输到单片机内,并将图像显示在LCD上。
图1 实验装置硬件组成
1.2 数字字符图像识别算法实验开发环境
数字字符图像识别算法的开发环境可采用MDK5实现,在MDK5软件中搭建STM32单片机的开发环境,添加STM32F4的固件库即可自主开发。图像识别算法的实现采用C语言进行开发,由于C语言具有运算速度快,简单易懂,灵活方便等特点,方便学生在嵌入式设备上进行快速开发。使用库函数模板进行开发,省去了繁琐配置寄存器的步骤,操作简单,易懂,学生可以直接调用相应库函数,就可以对寄存器进行操作,方便学生快速上手,并且已经有成熟的摄像头和LCD屏的驱动程序,直接添加使用即可,学生可以在短时间内熟悉软件并快速着手字符识别算法实验。
图2 OV2640模块连接图
2 实验装置硬件模块设计
2.1 OV2640图像传感器模块
OV2640摄像头模块,分辨率为1632*1232,采用1/4寸的OV2640百万高清CMOS传感器制作,具有高灵敏度、高灵活性、支持JPEG输出等特点。并且可支持曝光、白平衡、色度、饱和度、对比度等众多参数设置,支持JPEG/RGB565格式输出,可以满足不同场合的需求。OV2640模块连接如图2所示,其中,HREF为行同步信号,与STM32引脚PA4相连;VSYNC为帧同步信号与STM32引脚PB7相连;PCLK为像素时钟,输出一个(或半个像素),与STM32引脚PA6相连;SCL及SDA分别为SCCB协议的时钟信号线及数据信号线,分别与STM32引脚PD6和PD7相连,用于获取摄像头ID。数据线D0~D7为图像数据输出,在PCLK,HREF和VSYNC的共同控制下输出,与STM32引脚PC6-PC9、PC11、PB6及PE5、PE6相连。
2.2 STM32微处理器主控模块
如图3,微处理器主控模块采用32位MCU--STM32F407ZGT6,芯片主频为168 MHz,基于Cortex-M4架构,性价比高,性能好[6],拥有一个DCMI数字摄像头接口,接口传输速率可达54 M字节/ s。此外,微处理器还支持FPU浮点运算和单周期DSP指令,提升了计算能力,并且拥有丰富的外设接口,支持停止、待机和睡眠三种低功耗模式,用户只需要搭建简单的晶振电路和复位电路即可。
图3 微处理器主控模块电路图
2.3 TFT-LCD显示模块
显示模块使用的是3.5寸的LCD屏,LCD的驱动芯片为NT35310,480*320的分辨率,为电阻式触摸屏,采用16位8080并口。LCD模块连接图如图4所示,其中LCD_D[15:0]为16位的数据线,与STM32引脚FSMC_D0-D15相连;LCD_BL可控制液晶背光亮度,与STM32引脚PB15相连;LCD_WR为写使能信号,与STM32引脚FSMC_NWE相连,可向寄存器写入数据或命令;LCD_RD为读使能信号,与STM32引脚FSMC_NOE相连,可从寄存器中读出数据;LCD_CS引脚为片选信号线,与STM32引脚FSMC_NE4相连,低电平有效;LCD_RS为命令/数据标志,与STM32引脚FSMC_A6相连。
图4 LCD模块连接图
2.4 ESP8266数据发送模块
数据发送模块采用ESP8266设计,这是一款低功耗、高集成度的Wi-Fi芯片,支持超宽工作温度范围:−40 ℃~+125 ℃,在大部分的工作场合都能满足,能够适应复杂的环境。操作简单,只需要将该模块与微处理器连接两根通信线,就可以收发数据,并且可以实时发送数据,支持在手机端接收数据,可以满足本项目的要求。将图5中的引脚RXD、TXD分别连接到单片机的PB10和PB11即可。
图5 ESP8266模块电路图
3 数字字符图像识别实验
3.1 实验任务
为加深图像处理技术在实际生活中的应用及加强学生的实践动手能力,采用实验项目制教学方式,实验项目以数字字符作为识别对象,帮助学生们从实践中学习图像处理的知识。实验项目的任务:首先需要获取数字的图像信息,为提取其中重要的信息,需将图像做预处理,接着找出字符区域的位置;为了提高字符的识别率,因此,需要将字符区域的数字进行分割,分割成单个字符;又由于每次的采集图像的字符大小并不一致,所以需要对字符进行缩放处理,使其变成24*50大小的字体,最后运用模板匹配法进行字符识别。图像算法的具体流程图如图6所示。
图6 图像算法流程图
3.2 图像信息的采集
STM32F4微处理器芯片内部拥有一个DCMI接口(数字摄像头接口),该接口是一个同步并行接口,能接收外部8位、10位、12位或14位CMOS摄像头模块发出的高速数据流,速度可达54 MB /s。可支持不同的数据格式,例如YCbCr4:2:2/RGB565逐行视频和压缩数(JPEG)。DCMI将接收到的图像信息放到一个32位数据寄存器(DCMI_DR)中,然后利用DMA进行图像传输,并通过SCCB总线对摄像头进行读写,最后将图像转换成RGB565格式,并将图像传输到LCD屏上显示。图像的缓冲区直接由DMA管理,而不是由摄像头接口管理。本文采用SCCB总线控制摄像头图像信息的输出,直接读写摄像头的寄存器。其中SCCB是Omni Vision公司定制的串行摄像头控制总线,两线制SCCB与I2C总线类似,是一种双向二线制同步串行总线[7]。SCCB的时序图如图7所示。
图7 SCCB时序图
3.3 数字字符区域的定位
首先对图像进行遍历,使其做二值化处理,将每个像素点进行二值化之后,记录每次由黑到白或者由白到黑时的次数,记下每一行的跳变点次数,当相邻的像素点的颜色相同时,才不会被记录,记录每一行的跳变点,并将其还原成RGB图像并显示在LCD屏上。定义一个大小为[240]的数组,用此来记录每一行跳变点的数目,通过该数组,即可查看每一行的跳变点数目。在数字区域部分,跳变点相对于其它区域要多一些,每个二值化后的字符至少有2次跳变,若识别数字字符个数为6,那么至少会有12次跳变。则有数字区域的部分跳变点一般大于12,没有数字的区域则小于12。如果跳变点次数由小于12变到大于12,并且出现多行大于12,即可确定由小于12到大于12的这一上边界;接着如果由大于12到小于12,即可确定此边界为下边界[8-9]。具体应用时,可根据此规律,实现不同个数数字字符的识别。
在已经确定字符区域的上下边界的前提下,可确定字符的左右边界。由于数字字符的区域部分,与周围的颜色不同,图像容易受到光照条件的影响,而HSV模型不太容易受到明暗影响,且接近人眼对颜色的定义[10-12]。因此,可采用RGB转换成HSV格式,通过色度,亮度,饱和度来定义颜色,以便找到区域的左右边界。经过多次测试,最终确定阈值为150 <H< 255,30 <S< 70,5 <V< 20。利用这个阈值,遍历数字区域部分,从而确定左右边界。RGB转换成HSV的公式如下:
定位字符区域的算法流程图如图8所示。
图8 定位字符区域的算法流程图
3.4 图像的灰度化处理及二值化
由于采集回来的图像是彩色的,为RGB565格式,在进行数字识别之前需要将其预处理,将其转换成二值化,在二值化之前需要将其做灰度化处理,灰度化处理就是将RGB三种颜色的分量进行加权平均,可得到一个灰度值,直接利用式(4)就可以对RGB格式的图像进行灰度化处理:
而在实际应用中,为了提高运算速度,避免浮点数运算,将式(4)等号右边部分先乘以65 536,再右移16位(即除以2的16次方),可将式(4)转换为:
二值化即将图像上的像素点的灰度值设置为0或255,使之变成一幅黑白的图像,可将重要的信息和不重要的信息区分出来,本文将重要的信息,变成黑色像素点,不重要的信息设置成白色。将图像进行二值化处理之后,可让图像后续处理变得简单,显示更多的特征信息。可以根据环境的光照不同设置阈值的大小,将灰度化处理的灰度值和设置的阈值进行比较,如果灰度值大于阈值,则将该点变成黑色,如果灰度值小于阈值,则将该点变成白色。二值化算法的程序流程图如图9所示。
3.5 字符分割和归一化
在对字符区域进行二值化操作之后,由于在字符区域可能会存在噪点,为了避免出现误识别的现象,首先对二值化图像进行形态学处理。由于字符的有效信息为黑色,背景为白色,本文采用闭运算方法,即先膨胀,后腐蚀,来降低二值化图像的黑色噪点。字符分割采用投影法,从左边沿开始,先遍历字符区域每一列的像素点,并统计每一列黑色像素点的个数,判断如果某一列的黑色像素点大于5,则在此处划一条红色来确定第一个字符的左边界,再从第一个字符的左边界开始,如果黑色的像素点小于4,则在此处划一条红色以此来确定第一个字符的右边界。以此类推,即可确定剩下五个字符的左右边界。
字符的上下边界也是如此,在字符区域的上边沿往下开始遍历,当读取像素判别直到出现像素点为黑色时,即可确定一个字符的上边界,再从该上边界开始往下遍历,当读取像素判别到没有黑色像素点时,即可确定字符的下边界。由于采用的是模板匹配法来识别数字,而采集到的数字参差不齐,其中模板库的字符大小为24*50,与字符库的模板不是同一尺寸,因此需要将分割出来的字符进行归一化处理,将每个字符的大小变成24*50尺寸的字符,方便下一步与字符库做匹配。采用线性插值的方式便可以完成字符的归一化,先将分割后的字符拉伸宽度,然后在此基础上,再拉伸高度,使字符拉伸成24*50的尺寸。字符分割及归一化的算法流程图如图10所示。
图9 二值化算法流程图
图10 字符分割及归一化的算法流程图
3.6 字符识别
字符识别这里采用的是模板匹配法,即将需要识别的字符,与模板库中的模板进行匹配,匹配出相似度最高的一个字符。在进行字符识别之前,首先得完成字符模板的创建,将分割好的数字,进行归一化之后,做成0~9十个模板,每个模板大小为24*50,以0和1分别代表白色像素点和黑色像素点,并以十六进制储存,为提高识别率,可以将待测的字符模板,进行取样,将每一个待测的字符的数据按十六进制储存,这样字符模板就建立完成。之后,定义一个变量,将每一个归一化后的字符,与模板库进行一一匹配,如果匹配的像素点颜色相同,则变量加一,如果不相同,则减一。这样将该变量数值最高的值所对应的字符模板则为该数字,输出相应的字符模板的第几位数字,即可知道该识别的字符为哪个数字[13-14]。如图11为字符是别的算法流程图。
经过多次的实验及测试,选择合适的阈值及HSV的数值,建立好字符0~9的字符模板,最终的识别效果如图12所示。
在“显示”区域,显示摄像头采集的图像;在“拍照”区域,蓝色矩形框为数字的字符区域,矩形框内的红色线为每一个字符分割后的区域;在“归一化”区域有3个“4”,第一个“4”是从字符区域提取的,第二个“4”是将字符拉长横轴,第三个“4”是将字符变成24*50像素的尺寸;将该归一化后的数字与模板库中的字符进行匹配,寻找相似度为最高的字符,从而确定该字符;在“识别”区域,红色的数字“1,6,5,3,4,8”则为识别出来的数字,将其存放在一个数组内,即可以将其转换成实际的数值。最下方为4个按钮,按下“显示”按钮,即可将摄像头采集到的图像显示在LCD屏上;按下“拍照”按钮即可将一幅图像暂存在LCD上,并定位出字符区域;按下“识别”按钮即可识别数字的数值,并将该数值暂存在一个数组中。按下“发送”按钮即可通过ESP8266发送数据到接收端。
图11 字符识别的算法流程图
图12 识别的最终效果图
3.7 操作界面设计
本文使用的LCD为电阻式触摸屏,可支持触摸功能。在LCD上触摸时,会在X和Y方向会产生电压信号,并将电压信号上传给控制器,控制器在检测到有触屏时即会计算出(X,Y)的位置坐标,则根据此结果制作触屏按键。实现按键的具体函数为:
TP_Read_XY(u16 *x,u16 *y); //读取X,Y坐标
TP_Init(void); //触摸屏初始化
if(*x > 0&*x < 100&*y > 280&*y < 320); //判断触摸点是否在矩形按键内,如果是,则执行相应的操作。
如图12系统操作界面主要通过对LCD进行画线、填充颜色、创建矩形框及绘制汉字等操作实现,具体使用函数为:
3.8 ESP8266-WiFi模块移植开发
本文使用ESP8266-WiFi模块实现数据远程传输到手机终端,采用机智云开源程序开发手机终端App。首先在机智云官网创建个人项目,在手机上下载并安装机智云App,并将手机终端App与云端的个人项目进行绑定。然后给ESP8266-WiFi模块进行GAgent固件烧写,并在工程中移植相应MCU的Gizwits串口协议,使STM32单片机连上服务器,通过屏幕按键将下位机的数据上传到云端,云端再将数据发送到手机用户端,即可在用户手机端看到数据。
4 实验装置的创新与拓展
本实验装置的图像识别算法是基于MDK5实现[15],程序源代码可编辑,具有良好的开放性。因此,在该实验教学装置上,可以有效的引导学生们对图像处理的探究,从底层学习图像处理,通过学习和实践去了解图像处理的基础的算法,并在此基础上加以改善及创新拓展,改进图像处理的相关算法,提高图像的识别率及识别速度。本实验装置仅限定了需要实现的目标,但并未限制实现该目标所用的方法,学生们可以探索不同的实现算法。在本文的基础上,可让学生们实现不同个数的数字识别拓展,完成开放性实验。
在项目功能上,学生们可以在此实验装置进行改进,可以使该实验装置不只仅有数字识别的这一种功能,在此基础上,可以增加一些额外的功能,将源代码进行改进。例如车牌识别,扩展车牌识别所需字符库的字符模板,并且可以将部分汉字建立成字符模板,以完成车牌的准确识别。还可利用该实验装置进行颜色跟踪,将需要识别的颜色进行采集,先将其RGB格式转换成HSV格式,后将图像进行腐蚀,寻找腐蚀中心,即可寻找到相应的颜色,可进行颜色识别,颜色跟踪等功能。在该实验装置的基础上,可拓展许多符合现代化的智能化视觉检测设备。
5 结语
本文所搭建的实验装置,采用STM32单片机作为主控,相比较于复杂嵌入式系统设备而言,具有电路简单,价格低廉等优点,运用图像处理技术,实现了对数字字符的获取,在不同的光照环境下,也可以通过调整二值化的阈值,适应光照的变化,识别率和识别速度也能满足实际需求。该实验装置的搭建,有利于学生从零基础去学习图像处理的一些相关的知识,从底层开始编写程序实现对一幅图像的处理,对于图像处理的知识可有更深的了解。