手势识别实现人机交互
背景
手势识别技术作为一种新型的技术,不仅能够带来良好的交互体验,而且在现实生活中具有重要的应用价值。手势识别技术能够很好的帮助具有听力障碍和听力衰弱的人进行交流,同时,它也能帮助一些因为年纪大而行动不便老人,使他们通过手势交互实现远程控制,为他们在生活上带来更多的便利。
有相关研究表明,手势交互方式,对于老人来说,是一种更加容易理解和接收的交互方式。手势交互还存在以下的潜在应用场景:(1)虚拟目标操控;(2)多媒体和游戏交互;(3)车载娱乐系统;(4)用于卫生条件较差的环境下,如厨房和手术室等。

目标
设计一个系统可以开启摄像头识别左右手势来控制鼠标与键盘以达到人机交互的目的,手势操作可以自定义成想要的键盘按键(包括组合键)。能够通过预训练的手势动作,实现自定义的键盘按键以及鼠标动作关联,也可以通过自定义手势,训练想要的按键组合。

可行性分析
- 可以使用mediapipe库和pyautogui实现使用电脑摄像头进行手势识别,实时控制电脑鼠标完成移动、左右键、上下翻页等功能,实时控制键盘完成相应按键的按下。
- MediaPipe是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。MediaPipe的核心框架由C++实现。MediaPipe Hands为MediaPipe中的手部识别模型,它是一种高保真手和手指跟踪解决方案,采用机器学习 (ML) 从单个帧中推断出手的21个3D地标。
- AutoPy是一个简单跨平台的 Python GUI工具包,可以控制鼠标,键盘,匹配颜色和屏幕上的位图。
项目方案设计
主体

下图代码实现了opencv对图片获取与转换,并且根据mediapipe得到手部关键点结果。

下图代码实现了手部关键点信息的处理,得到识别手势结果。

下图代码利用了pydirectinput实现了对鼠标、键盘的控制。鼠标位置根据于右手食指相对画面位置决定,利用预先设定的手势执行鼠标点击操作和键盘按键按下。在执行组合键时,将所需要的几个按键按下后延迟几秒再释放便能达到需要的效果了。

跟踪

手部检测

下图代码实现了手部关键点的绘制。


位置处理

手指识别

手部检测

行为控制

模块调用关系

项目部署与展示
项目整体是基于GitHub上给出的开源手势识别项目hand-gesture-recognition-mediapipe,在此基础上进行二次开发。
hand-gesture-recognition-mediapipe给出了部分简单的预训练手势以及展示效果,如下图:

但是为了让手势识别能够落实于一个具体的项目,我们首先将目标定于简单的马里奥游戏即需要能够识别上下左右四个按键的手势,并实现与马里奥游戏的按键交互。其中需要自行录入较多的操作手势进行一个模型训练,为了方便操作以及简化训练,我们采用左手操控按键,右手控制鼠标的方式。在尝试的初步效果还不错后,我们便是将方向转移至较为复杂的英雄联盟游戏,其中需要录入较多技能按键,以及实现鼠标的左右键控制。

但是在录入数据,并测试外界反应正确之后,却无法实现游戏中的按键相应,究其原因可能是英雄联盟游戏内部将按键操作识别为了第三方软件的介入,阻断了类似于脚本按键的控制,只能选择较为简单的游戏控制如2048、贪吃蛇,最终的实现效果是Vampire Survivors这款游戏。同时基于糖豆人游戏这款游戏,我们又使用了组合键(跑跳)。
项目总结
手势识别技术尽管已经在过去十多年间有了长足的发展,但是在手势识别上依然存在很多的挑战。首先,手不是一个刚体目标,而是一个拥有20个自由度(DOF)铰链型的目标,因而,手势是很灵活和多变的,这意味着,同一个人在不同的时间和环境下,手势都会不一样;其次,动态手势的手部动作是一直在变化的,这导致手的动作速度一直在连续变化,不容易捕捉;再者,有时候,负样本会跟待识别的正样本具有很高的相似度,从而导致识别精度不高;最后,一般而言,手势识别的识别反馈时间要少于100ms,这要求识别方法要足够的快速。
综上所述,手势识别技术在现实生活应用上具有很大的价值,并且这项技术依然不是很成熟,具有很多待攻克的困难,因而,手势识别技术依然具有很高的研究价值。