基于手势控制的人脸追踪系统设计与实现

作者: 周久韧 李晴

基于手势控制的人脸追踪系统设计与实现0

关键词:机器视觉;人脸追踪;追踪学习检测(TLD) ;手势识别;网络实时图像推流

中图分类号:TP302 文献标识码:A

文章编号:1009-3044(2023)22-0040-05

0 引言

目前,大多数人脸追踪的产品只能通过改变摄像头的拍摄角度来实现人脸追踪,无法满足大范围的人脸追踪需求。本文主要是基于目前国内外人脸检测和追踪,以及步进电机导轨控制等相关技术,设计并实现了一款以树莓派4B开发板为人脸追踪算法及主控中心,以小型CSI 摄像头为图像输入模块,以OpenCV-Python软件库为算法的核心库,以8051系列单片机为外部硬件控制中心,以3086A-MFP10S芯片为放大单片机系统输出信号的驱动模块芯片,以两相四线42步进电机导轨为系统的主体硬件运动部分;通过对摄像头获取的图像进行人脸追踪,由树莓派输出控制信号,且新型、结构简单、成本低廉、功能齐全的人脸追踪系统[1-2]。该系统除了能控制导轨运动和实现人脸追踪功能外,还可以进行手势识别控制、网络实时图像推流及控制等功能。

目前,完成人脸追踪都需要调用摄像头并进行人脸检测。人脸检测可以通过建立深度学习的Tensor⁃Flow神经网络框架方法来实现,然后通过树莓派上的CSI摄像头进行图像采集和获取,再用OpenCV进行图像处理,并进行人脸检测,从而得出人脸的相对位置,并控制系统运动[1]。另外,还可以采用其他常规应用在3D摄像头下的高精度人脸检测方法,如Kanade-Lucas-Tomasi(KTL) 法、粒子滤波法、追踪学习检测法、PHD(Probability Hypothesis Density,概率密度假设)滤波器法[3]。通过比较以上方法的优缺点并权衡成本关系后,决定采用追踪学习检测法进行人脸检测。

在与人脸追踪相关的系统硬件设计中,一般采用STM32单片机的PWM信号输出来控制舵机,根据人脸在画面中的相对位置,对摄像头进行一定角度的转动,即可实现人脸追踪[1]。该方法常用于监控、安防等领域,虽与本文所实现的功能很相似,但摄像头只能固定在一个点位上进行摄像头转动的控制,而不能实现大范围的导轨式平移控制。另外,直接采用单片机控制设备进行驱动,可能造成驱动电流低、驱动能力弱的特点。所以,增加驱动模块,使树莓派和单片机仅输出控制信号,并采用驱动模块增加驱动电流,进而控制舵机等外部硬件设备。

在本文所设计的系统中,需要将舵机替换成步进电机导轨,可以实现大范围的导轨式平移控制[2]。本文中所用到的步进电机导轨为42步进电机导轨,其电机为两相四线步进电机,共有6路输入引脚,另外两个悬空引脚为COM端引脚,可以接入高电平进行更大电流的驱动控制。本文研究所采用的驱动模块主芯片为3086A-MFP10S芯片,此芯片的驱动能力可以驱动42步进电机导轨[2]。

在本文研究设计的系统中,将驱动模块与硬件控制系统分开设计,能够有效减小电机反转时造成的反相电流对硬件系统的影响,从而避免单片机系统损坏。另外,在功能设计上,网络实时图像推流及控制功能,可以使系统的实时图像能够直接通过网络通信的方式,被手机、电脑等设备直接看到,同样也能达到网络摄像头或网络远程监控一样的效果,还可以通过网络的上位机设备直接控制整体系统;手势识别及控制功能则可以通过不同的手势来控制整体系统。

1 系统总体设计

人脸追踪系统是一个悬挂式或地轨式的控制设备,能够自动追踪人脸的正脸进行左右移动,从而实现使摄像头拍摄到的人脸始终在一个居中位置。

整体系统从功能上进行分解,可由以下4个子系统及模块组成:1) 基于OpenCV的人脸追踪系统。2) 基于51单片机的42步进电机导轨控制系统。3) 基于MediaPipe的手势识别及控制系统。4) 基于Flask的网络实时图像推流及控制系统[4-7]。

系统运用场景及结构图(侧面)如图1所示。

当系统摄像头前的人左右移动时,系统便会控制导轨追踪人脸进行移动。但只有人的正脸被检测到时才会被系统追踪;如果在系统追踪人脸的过程中,人物因移动过快跑出画面而导致人脸丢失,或者因正脸被遮挡而检测不到,系统则会保持上一个追踪状态,直到重新检测到人脸或运动到限制位置。

系统的控制模式分为两种:1) 手动模式,即不进行人脸追踪,采用手势或终端设备进行控制、调试、设定导轨等。2) 自动模式,即进行人脸追踪,控制步进电机导轨跟踪人脸进行移动。

在网络控制中,控制设备可以是手机、平板、电脑等,也可以是与树莓派开发板连接到同一网络下的设备(即上位机)。另外,也能够通过网络将图像实时发送到终端设备浏览器对应的目标网址上,实现同网络摄像头、网络监控一样的功能。还增加了修改人脸追踪阈值的功能,能更改人脸追踪系统中,对人脸中部位置的定义范围,从而影响人脸追踪灵敏度。

系统硬件方面主要由树莓派、小型摄像头、单片机、步进电机导轨及驱动模块构成,软件方面主要由Python和C语言编写。导轨在用于大型导播室时可以采用地轨式设计,比悬挂式更稳定。

树莓派的作用主要是将模块整合起来,实现集人脸追踪、手势识别和网络实时图像推流于一体的功能;而单片机部分则实现对步进电机导轨的控制。由树莓派开发板的GPIO口输出信号,单片机部分接收信号后即可控制步进电机导轨。

2 基于OpenCV 的人脸追踪系统设计

基于OpenCV的人脸追踪系统为整体系统最重要的软件核心子系统。该部分的设计决定了整体系统在进行人脸追踪控制时的功能。

此子系统主要实现的功能就是能够检测出摄像头前的人脸,并且通过比较摄像头图像大小和人脸位置中心坐标的关系,从而对人脸的位置进行判断,输出相应的信号。在这里,既要在保证系统的延时不高,又要能够准确输出“左”“右”“中”三种人脸位置信号。

系统采用追踪学习检测法来进行人脸检测。此方法不需要关于面部结构的知识,且易于编程,不需要有关机器学习的相关知识,数据的准确度取决于分类器的数据[3]。在这里采用OpenCV官方的人脸正脸检测器。

为了进行人脸追踪,首先通过人脸检测计算出图像中被检测人脸中心的坐标,将其与实际摄像头画面宽度值进行对比,即能判断出人脸所在位置。如将画面中心点计算出来,左边界点到中心点减去50像素的部分定义为“左”,中间左右各50像素的部分定义为“中”,中心点往右50 像素至画面右边界点定义为“右”,从而将画面分成三个部分;当人脸被检测到时,其中心点总会在其中一个位置。

如图2所示,可以利用print函数在终端页面上进行人脸位置状态结果的输出,即可获取输出结果。

3 基于51单片机的42步进电机导轨控制系统设计

基于51单片机的步进电机导轨控制子系统,是整体系统中最为核心的硬件子系统,其决定了控制42步进电机导轨运动时的性能和功能。步进电机导轨中的步进电机为42步进电机导轨,即一种由两相四线步进电机驱动的导轨,其共有4个输入端,分别为A+、A-、B+、B-[8]。42步进电机导轨实物图如图3所示。

3.1 步进电机导轨控制功能实现

选取3086A-MFP10S(B)芯片作为驱动模块的主要芯片。用此芯片驱动步进电机,只需要对其三个输入引脚发送信号即可,大大简化了单片机系统的控制方法。

在驱动步进电机导轨运动时,ENA要置高电平,且IN1、IN2也要满足一定的时序关系。IN1、IN2共四种电平状态,IN2置1后,IN1要滞后IN2四分之一个周期。ENA、IN1、IN2,以及驱动模块四路输出引脚的时序关系图如图4所示。

在该单片机控制系统中,将P0.0、P0.2与驱动板的IN1、IN2相接,P0.1与驱动板ENA相接,故单片机P0 组IO 口的输出状态可依次为0x03、0x07、0x06、0x02[9]。若按逆序输入信号则可实现反向运动。

经过硬件测试,状态输出的最佳间隔应为2 ms,一个完整的控制周期即8 ms。按2 ms的时间间隔输出,连接导轨皮带的齿轮不易打滑;若是降低到1 ms,则会完全打滑。在单片机的C语言程序上,延时1ms 定义为经过125次赋值操作[10]。通过控制延时的时间,就可以控制导轨运动的速度。延时时间越长,导轨运动速度越慢;反之则越快。

另外,经过对输出信号次数的标记,即可实现软件上的运行限度定义,也可以对初始位置进行标定;同时,在开机后,以4 ms的时间间隔输出信号,可以使导轨慢速运动,使其在后续正常运动时做到完全不打滑。

3.2 硬件系统简化

采用PCB 设计并制版的方式来简化单片机系统[8]。树莓派开发板通过GPIO口与单片机系统相接,而单片机系统只需要有4个引脚输入信号,可以根据树莓派GPIO口的排列,在单片机系统板的背面设计了一个20×2引脚插座的形式,便于单片机系统和树莓派开发板的连接。单片机系统板原理图如图5所示。

图5中的J1即为40引脚插座,由于其设置在单片机系统的背面,故接线方式参照的是树莓派开发板的GPIO口排列的镜像位置。其中GPIO.4和GPIO5(BCM 编号23、24) 与两个LED相接,用于整体系统运行时的状态表示。J1 的25、24、23、22 引脚分别对应GPIO.22、GPIO.23、GPIO.24、GPIO.25引脚,与单片机对应的P3.0、P3.1、P3.2、P3.3引脚相接。

4 基于MediaPipe 的手势识别及控制系统设计

手势识别的基础是手势关键特征点检测。采用Solutions方法下的Hands模块来进行人手检测,从而获取到人手的21个关键点坐标和左右手判断值。

其21个特征点分布如图6所示。通过对各个手指关键点的坐标进行特征向量定义,并计算出一个手指的两个特征向量角度,即可判断手指是张开还是闭合。

图6中,点3、5、9、13、17的坐标相对于手掌0点总是固定的,故以大拇指为例,应采用序号为2、0和3、4 的特征点进行特征向量定义,进而计算出角度。通过2、0特征向量与3、4特征向量坐标求得其夹角余弦值,并反余弦求解,即可得到角度。

通过多次测试,最后总结出了三个手指角度与手指状态的规律:

1) 除大拇指外,其他手指闭合时,其角度大于65°;

2) 大拇指闭合时,其角度大于53°;

3) 对于所有手指,当手指张开时,其角度小于49°。

通过定义不同的手势所对应的手指状态,即可实现手势识别。在这里共定义了15种手势,加上左右手判断则可以实现30种不同的手势识别。手势识别测试效果如图7所示。该手势即为中指、无名指闭合,其他张开,取名为“Spider-Man”。

5 基于Flask 的网络实时图像推流及控制系统设计

该子系统的功能主要在手机、电脑等主系统联网的上位机设备实现,其控制功能与手势识别及控制系统大致相同。另外,网络实时图像推流及控制系统也能够将系统摄像头前的图像实现发送到上位机中对应目标网址上,实现同网络摄像头、网络监控一样的功能[11]。

在前端页面设计上,主要用HTML来进行网页设计,其设计的网页如图8所示。

而后端部分,则利用Flask库对前端表单提交的数据进行处理,实现相应的功能,并进行图像推流。

在图像推流中,对OpenCV采集的图像进行处理,并转为bytes类型图片,由Flask推送到对应地址。若循环推流,则在前端网页上看起来与视频效果无异。

在前端上,通过img标签指向推流地址即可看到实时图像,延迟仅0.15s左右。

上一篇 点击页面呼出菜单 下一篇