周星雨 袁尧鑫 唐亮
关键词:手势识别;PAJ7602;STC89C51单片机;视力检测;人工智能
随着各类电子产品的迅猛发展,极大程度上提高了人们生活的便捷度,但同时儿童及青少年存在因沉迷手机、电脑等电子产品导致视力下降的现象,定期进行视力检测,监测视力变化,极大可能地预防近视的发生。目前视力检测通常需要在专门机构的医师辅助下完成,过程烦琐、效率低,无法实现智能自助式体验。伴随人工智能技术的发展,机器学习、人工智能等名词出现在人们的视野[1-2],将基于机器学习的手势识别交互系统应用于视力检测过程,实现智能自助式视力检测,提高检测的效率。
近年来,手势识别主要有基于机器视觉、超声波探测和MEMS惯性传感器三种实现方式。2020年陈振烁等人[3]设计一款基于FPGA的手势识别系统,采用开发板和视频图像处理技术,实现图像采集、处理、手势抓取和识别等功能;谢新等人[4] 设计一款基于STM32的智能家居控制系统,利用MPU6050传感器进行手势识别后传输至单片机,从而控制相应的家居设备;2021 年李昌锋等人[5]采用SVM 算法进行手势识别,用于自助判断视力检测中的手势方向;2022年任雁等人[6]运用多种数字算法,结合机器视觉进行手势视觉,用于银行自助取款机安防机器人。本文利用单片机设计一款可根据特殊手势命令的输出,实现非接触式人机交互进行自助式视力检测。
1 系统总体设计方案
视力检测系统包括单片机主控板、手势识别模块和显示模块等[7]。系统整体框图如图1所示。
建立手势识别样本库,将视力测试的图标与“上下左右”四个方向进行一一对应。单片机是整个交互系统的核心,负责控制手势识别的全流程。利用手势识别模块PAJ7620U2芯片采集视力检测手势姿势,将手势转换为图片信息,消除图片背景,提取手势信息传输给单片机。单片机对信息进行处理分析后,在LCD1602液晶显示器上显示对应手势信息,点亮代表对应手势的LED灯。将手势信息与手势识别样本库的视力测试图标结果进行比对,结合预先设定的视力检测原则,得出最终代表该检测者的视力水平。
2 硬件模块设计
2.1 单片机模块
本设计的单片机采用的是STC89C51为主芯片,具有32个双向I/O口、256kB RAM及3个16位可编程定时器等资源。该51单片机资源配置灵活,满足本设计要求。单片机芯片周围配置有2.1寸彩色液晶屏可用于手势识别结果显示,并配备有USB接口可实现程序下载、单片机供电和串行通信,8路LED灯可辅助显示手势识别上下左右四种结果。单片机及外围电路图如图2所示。
2.2 手势识别模块
手势识别模块PAJ7620U2是一款可识别九种基本手势包括上、下、左、右等,与视力测试图标方向对应一致,满足检测需求。该芯片识别手势速度快且支持手势不断输出,自带LED驱动可向外发射红外线信号[7],一旦在可探测范围内探测到物体,传感器阵列和目标提取会提取目标相关特征信息,并将相关特征信息存储至应对寄存器。手势识别阵列通过对相关特征值进行处理,与模块已有的手势识别特征库进行比对,识别结果传输至寄存器,通过I2C与单片机相连接,实现手势显示。PAJ7602硬件模塊原理图如图3所示。
2.3 显示模块
LCD液晶显示器主要用于将上下左右四种手势显示出来,通电后液晶分子产生点、线、面以及背部灯管构成各种图像。LCD1602是一款16引脚器件,E引脚为使能信号端,用以控制液晶屏显示数据的时钟信号,采用上升沿触发实现数据传输。VL是液晶显示偏压信号,用以调整图像与背景显示对比度,通过调整偏压信号得到最强的对比度。8位并行数据口与单片机直接相连,提高数据读取的便捷性。RS和R/W 引脚用于选择LCD的工作方式及数据的读写操作,实现对液晶屏工作时序的控制。
LED灯用于代表不同手势的显示,进行手势识别检测时,液晶屏幕上会显示“上、下、左、右”四种手势,对应的LED灯点亮进行提示。
2.4 电源模块
STC89C51单片机输入电压3.3V,显示模块等输入电压5V,因此采用单片机自带的USB接口进行电压供电,采用ME6211实现5V至3.3V的电平转换。
3 软件模块设计
3.1 软件设计思路
本系统的软件设计思路为:①预先设定手势库样本信息,将视力检测不同大小和方向的“E”与“上下左右”四个方位一一对应;②系统开始后,随机显示某视力水平的“E”图标;③手势识别模块通过红外检测识别有无物体,并判断待测物是否为模块可识别的九种手势,识别结果存储至寄存器中,寄存器的信息传输给单片机,并将识别后的手势在液晶屏上显示;④单片机通过比对手势识别模块的结果和显示的“E”图标是否一致,对单次检测做出结果判断;⑤重复上述检测步骤,至被测者能够看清的最小图标。系统流程框图如图4所示。
3.2 程序设计
3.2.1 手势识别程序设计
进行手势识别前,需要创建手势样本信息库。本文采用从学校随机选取200名学生,以学生的手势图作为数据样本,每名学生分别采集上下左右四种手势图共计20张,即可获取4 000张手势图作为样本数据。按照训练集和测试集7:3的比例进行随机划分,其中2 800张作为训练集,1 200张作为测试集。训练集用来对手势识别模块算法进行调整,测试集用于验证算法识别的准确性。同时,将视力检测表不同大小的视标“E”与“上下左右”四个方向一一对应,建立数据集,用于后续视力检测结果比对。视力检测需识别的手势示意图如图5所示。
对于手势识别模块(数据采集)进行程序设计步骤如下:①模块初始化。先进行上电初始化,将数据手册提供的配置写入寄存器;②手势识别初始化。对传感器进行检测初始化,传感器默认状态为高电平,只有当传感器状态从高电平变为低电平时,开始进行数据采集;③I2C通讯设置。手势识别模块与单片机连接进行数据的发送和接收,主从机模式,每传输完数据后接校验位用来提醒发送端已完成数据接收。
3.2.2 视力检测程序设计
由于不同视力对应不同大小的E,本文设计采用二分法进行检索以提高视力检测效率。设置视标数组从4.0到5.3,通过不断检索和比对判断视标数组,得出受检者当前视力水平最终值。
步骤1:参数初始化,设置视力测试单次结果的标志值value。如识别手势与所给“E”图标方向一致,则表示单次检测结果正确,value=1;反之则代表错误,value=0。则说明测试者当前视力值为所给图标代表的视标值4.0。
步骤2:采用二分法检索,取4.0和5.3的中间值视标对应的“E”在液晶屏上显示。将手势识别模块识别结果与视标“E”进行比对,每视标水平进行3次检测。
步骤3:根据单视标视力判别规则,判断测试者视力水平是否为该视标等级。判定规则为:对于同一级别的视标,总共进行3次测试。在3次测试内,如果辨认失败次数大于成功次数,则认定为不能看清该视标,反之则认定为可看清该视标,进行下一步视力水平检测。如果受测者可看清该级别的视标则进一步缩小检索视标范围,如果看不清则向更大级别的视标区间检索。
步骤4:重复步骤2、3,直到测试者视标数组的最小值大于数组最大值,即测试者完成视标数组区间检测,视力水平测试检测完成,输出显示测试者的最终视力水平,视力水平检测过程结束。
4 系统调试
通过keil uVision5進行程序编写,将单片机等硬件模块经USB接口连接至电脑,进行软硬件联合调试,对各个模块程序参数进行调整,硬件部分进行调试,直至整个系统完成相应功能。
首先,确定各硬件模块能正常上电工作。接通电源后,单片机模块电源指示灯亮,且借助STC-ISP软件烧录简单程序,能正常显示效果,则表明单片机可以正常工作。液晶显示模块和LED灯显示模块在单片机电路周围,单片机上电后,测试液晶屏和LED灯能都正常显示数值及显示的准确性。其次进行手势识别模块检测,本设计主要测试PAJ7620模块对上下左右四种手势的识别,进行测试时,如果测试者手势向上,对应LCD屏上应显示当前手势,且代表上下的LED亮,则说明手势识别模块和显示模块可进行准确检测与显示。对各模块调试结果如表1所示。最后,通过多次实验测试手势识别的准确性,若准确率较低,则需要进行相应的软硬件调整。
5 结束语
本设计完成了基于手势识别的自助视力检测系统,主要通过手势识别模块进行手势数据采集,传输至单片机后将识别手势进行显示,并与预设结果进行比较,多次检测后得到最终被测者视力值。系统突破了传统视力检测模式,实现了自助式、便捷式。当下青少年视力问题日益凸显,本设计为青少年定期视力检测提供了便捷。