邹 龙 华 ,朱 永 强 ,张 平 霞
(青岛理工大学机械与汽车工程学院,青岛 266520)
手势识别是指通过计算机摄像头等光学传感器识别人手(或手和臂的组合)姿态或动作并判断其意义后进行人机交互的技术。为使人机交互变得更加顺畅,一些研究人员采用OpenCV(一个基于Apache 2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件库)对手势动作进行识别及跟踪,通过MediaPipe 技术实时生成手掌检测模型及手部坐标模型,将手势实时跟踪结果计算出来并传递给计算机,以实现基于手势识别的人机交互。[1-2]文献[2]设计了一种基于WiFi 的手势控制识别系统,根据WiFi 定位算法计算手势设备佩戴者与多种智能设备之间的距离,选定接收设备;由手势设备的加速度感应器收集手势数据,并通过滑动均值滤波算法进行数据预处理,对所截取出的数据采用DTW(Dynamic Time Warping,动态时间归整,简称DTW)算法,将手势信息和手势库的数据进行匹配,从而获得特征手势信息;将特征手势信息转换成指令,通过WiFi 模块发送信号给被控制设备,最终实现了8 种手势的判别并控制多种设备的运行,手势识别率达到98%。文献[3]以MSP430 单片机为主控器,以FDC2214 传感器为检测核心,实现了学习和判决两种工作模式。文献[4]根据MediaPipe 技术研究了一种通过构建目标手部模型、关键点定位和数字手势识别模块实现数字手势识别的方法。文献[5]提出一种结合手势的整体移动与部分手指移动的识别模式,根据此模式对DHG-14/28 动态手势数据集中14 类手势和28 类手势进行实验,分类识别准确率分别为98.57%和88.29%。上述手势识别方法在实际应用中对硬件和软件的要求高,操作不够简便。基于此,本文提出一种硬件配置成本低且操作简便的基于手势识别的小车控制方法。
二轴轮式智能小车主要由Arduino Nano 单片机、摄像头、电源、4 个电机、车架板、控制模块和4 个橡胶车轮组成。Arduino Nano 是具有USB 接口的Arduino 小型版本,采用无电源插座和Mini-B 型的USB 接口,板型小巧,核心处理器是ATmega168(Nano 2.x)和ATmega328(Nano 3.0),供电方式主要有mini-B USB 接口供电和pin27 +5 V 接外部直流5 V 电源两种。在此实验中采用外接+5 V 电源的方式给Arduino Nano 供电。[6]如图1 所示,两组车轮分别安装在两组电机转轴上,使电机能够带动车轮旋转,图1 中两组电机安装在车架板的两侧,对称分布,摄像头安装在车架板的前部正中央,便于识别手势,Arduino Nano 单片机、控制模块和电源均被固定在车架板的上面。
图1 二轴轮式智能小车
整个软件控制系统可分为两部分:①基于摄像头的手势摄取模块,主要通过小车摄像头摄取外部手势并将图像信息传递给Arduino Nano 单片机。②二轴轮式小车的下位机软件控制系统,主要是通过在Arduino Nano 单片机中运行的Python 代码对手势摄取模块传递过来的手势图像进行手部坐标标记,并对坐标点之间的距离和实时跟踪结果进行计算处理,再将计算结果传递给计算机控制模块,随后控制模块根据计算结果来控制小车进行前进、后退、左转、右转和停止。在运行程序进行手势识别的过程中,做出前进、后退、左转和右转的手势时,食指、中指、无名指和小拇指的斜率是相同的,摄像头检测到手部关键点后,将会进入循环开始处理每个检测到的手部关键点,并获取每个关键点的坐标,将坐标存储在xs 和ys数组中。然后,在图像上绘制关键点的圆圈和标注;再调用g_count 函数来计算手部特征值,并根据特征值输出不同命令。
以前进手势程序代码为例,含义为4 个绝对值差值的和小于4.5、0 点到12 点之间的距离大于100 mm且中指斜率大于2,部分程序代码为:
if(bs0+bs1+bs2+bs3)<4.5 and dis>100 and bs[1]>2:print("前进")#前进左手掌心向前
elif(bs0+bs1+bs2+bs3)<4.5 and dis>100 and -1<bs[1]<0:print("左转")#左转右手五指并拢指向左边
elif(bs0+bs1+bs2+bs3)<4.5 and dis>100 and0<bs[1]<1:print("右转")#左手五指并拢指向右边
elif(bs0+bs1+bs2+bs3)>4.5 and dis>100 and bs[1]<-2:print("后退")#后退右手掌心向前
elif dis<100 and bs[1]<-1:
print("停止")#停止握拳
本次实验采用Python 3.9 软件,所需的库包括OpenCV、Mediapipe、Time、Math、Cmath。其中OpenCV是视觉库,用于处理图像和视频;Mediapipe 是一个集成的机器学习视觉算法工具库,在此实验中通过Mediapipe 对手部进行识别追踪,再利用手部21 个坐标点的位置计算,实现手势识别功能;Time 用于计算帧率;Math 和Cmath 用于进行数值计算。实验创建了3 个空列表xs、ys、bs,分别用于存储手部关键点的x坐标、y坐标和手部关键点的相关计算值的数组,然后使用for 循环初始化这些列表,具体函数实现如下:
xs =[]
ys =[]
bs =[]
#大小为21 的数组初始化
for i in range(0,21):
xs.append(0)
ys.append(0)
for i in range(0,4):
bs.append(0)
定义了名为two_point_distance 的函数,用于计算两点之间的距离;定义了g_count 的函数用于计算手部的特征值;并使用sqrt 函数来计算欧几里得距离和返回距离值,具体函数实现如下:
def two_point_distance(x1,y1,x2,y2 ):
dis =abs(math.sqrt((x2 -x1)*(x2 -x1)+(y2 -y1)*(y2 -y1)))
return dis
def g_count();
a=5
i=0
最后,在主循环中,使用while True 持续从摄像头读取视频帧,具体函数实现如下:
while True:count=()
success,img =cap.read()
imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)results =hands.process(imgRGB)
小车的手势识别程序运行逻辑图如图2 所示。
图2 小车手势识别程序运行逻辑图
将小车前端的摄像头正对着操作者,手在摄像头的正前方,做出“掌心向前且五指并拢向上”(见图3a)、“掌心向后且五指并拢向下”(见图3b)、“握拳”(见图3c)、“右手五指并拢向左”(见图3d)和“左手五指并拢向右”(见图3e)的手势,分别可以得出“后退”“前进”“停止”“右转”和“左转”的识别结果,通过测试,手势识别率达到97.6%。Arduino Nano 单片机根据Python 程序计算出的手势识别结果,执行相应手势对应的控制命令,且将控制命令直接传输给小车的控制模块,达到控制图1 所示二轴轮式小车的对应行驶功能的目的,经过实验,小车根据指令运动的准确率达到了97%,且小车能够根据指令完成后退、前进、停止、右转和左转动作。
图3 小车控制手势示意图
本文利用Python 软件设计了一种基于手势识别的小车控制方法,实现了5 种手势的小车稳定行驶控制,操作简单方便。经过测试,此手势识别方法的识别准确率达到97.6%,基本能实现让小车根据指令进行运动。后续研究需进一步提高手势识别的准确率。