利用mediapipe 捕捉手势,以此控制游戏交互初步研究

一、简介

mediapipe是Google的手势识别框架,主要是分析通过从摄像头抓取的图像来定位和识别手掌和手指关节位置,其效果大概如下

mediapipe 本身基于深度学习的原理,所以可以借助于GPU来实现算力加速,在代码中可以设置是使用CPU运行还是GPU来运行,以我的红米note9为例(这个手机很老了),cpu执行一帧的推理大概在120毫秒左右,而使用GPU只需要40毫秒左右。速度差别肉眼可见:

二、实验

我尝试用自己写的一个小型游戏框架来实现一个简单射击游戏,其效果如下

从结果来看效果很一般,我先说思路,再说问题

1.如何控制方向

上图是API返回的手掌各个关节的数据,经过实践发现使用第0个点和第5个点与X轴的夹角来实现方向的控制效果更好

2.如何激发弹丸

主要是计算第5,6,8这3个点的夹角和变化状态,从弯曲(大于9度)变成趋近于水平(小于9度)的状态,我认为是要激发发射动作,然后也有几个问题需要解决

1.抖动,这个毕竟是人工智障没法特别精确的计算关节尤其是当部分手指处于遮挡的情况,另外当伸直手指的时候晃动也会带来角度的剧烈变化,这个实际上是误识别
2.如何判断手指趋近于水平,其实并不能以单纯的0度作为判断标准,毕竟没有这么精确,这里我选择只要小于9度(当然也可以看成大于171度,看怎么写代码)就当做是水平状态,
3.如何判断状态切换,既由弯曲到伸直的状态,这里我以大于9度作为一个界限,大于9度当做完全,小于9度为伸直,以此来激发大炮发射,实际上还是因为抖动和误识别,发现效果很差,后面我又加了一个限制,两次角度差大于5度才算激发这个动作,效果更好一点,但是某些情况下任然会误识别,尤其是晃动手的时候,这就无解了...
4.还有一个改进办法,就是判断手指角度变化趋势,既从大一直变小,一直到小于9度,作为激发状态,我想效果应该更好,但是晃动和遮挡以及某些姿态下的无识别,似乎无解
5.发热严重,cpu模式发热量小一些,但是延迟太大,几乎没法用,gpu更快,但是发热量更大,导致手机快速升温,进而带来严重降频,导致gpu推理每帧也达到了100ms以上,失去了实用价值

三、改进方向

1.在官方的demo中提到,要求输入图片比例4:3(默认预览大小是480X640),因为这个比例大小和他们的制作模型的大小最接近,我试图指定相机指定预览大小为1920x1080,这个比例和4:3差得有点多,结果运行报错。既然不能改比例,那么我可以改相机预览的大,然后裁剪成4:3送给模型来识别,既减轻了相机预览的压力,也减少了模型推理负担(感觉效果会变差,而且收需要离得更近)

2.关闭相机预览,只获取数据流,减少绘制压力

3.使用灰度图,不合成rgb,以我做opencv的经验,如果只从相机预览中获取灰度图,不合成rgb图片能至少节省整个相机的成图过程的一半的算力,在别的框架我做个类似的尝试,在这个场景下这个可以行得通

因为发热太严重了,我感觉继续尝试的价值不大,暂时没有做上述优化,特此笔记以观后用....

四、源码

handpose game: hand pose game

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值