人工智能 - 利用人体姿势检测做健身游戏(仅限高级版,难度:3级)
-
用到的相关知识
介绍
在这篇教程中,大家将利用人体姿势检测做一个健身游戏。不同的姿势将显示在舞台上,玩家要以最快速度做出这些姿势。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/6375abe6-43a0-42e8-b412-921e31f5af5a.gif" width="608" style="border-radius: 5px; border: 1px solid #29622d;">
第1步 - 新建一个项目
在创益编程游乐场中新建一个项目。删除角色“角色1”,把角色“空的1”改名为“主角”。
第2步 - 运行身体部位检测
当点击绿旗时,我们要立即运行身体部位检测。这会打开摄像头并实时分析摄像头影像。大家要把“调试”设置为“是的”,就会自动显示身体关键部位。

在“变量”类别中会自动创建一个表格“i”。请勾选表格“i”前面的勾选框,使其在舞台显示:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/57b17f2c-2885-4107-8c66-d62d6eacda56.gif" width="300" style="border-radius: 5px; border: 1px solid #29622d;">
然后运行程序。大家会看到身体关键部位被标记出来,表格“i”实时更新:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c2890b2e-b478-49f0-84e0-0727fbe2e099.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第3步 - 添加深蹲造型
接下来,取消勾选表格“i”,添加一个“深蹲”姿势的造型。大家可以用造型“多利亚-d”,然后改名为“深蹲”:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/af284c6f-fa19-47e0-81a3-12bd6e92b893.gif" width="1094" style="border-radius: 5px; border: 1px solid #29622d;">
把角色大小设为130,然后移动到舞台右下角。这是玩家的第1个目标姿势。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/6f23c3cd-a65e-4cbb-9d74-2fff4fcfef84.png" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第4步 - 分析这个深蹲姿势
尽管我们知道每个身体部位的位置,但我们不知道玩家摆的是什么姿势。为了自动检测玩家是否是深蹲姿势,我们重点看这4个点位:左胯、右胯、左膝、右膝。
主要观察点为,当玩家做深蹲姿势时,两个膝盖的距离要比左右胯部距离宽得多。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/962e72bb-04c2-41fd-9386-cfae128bea1d.png" width="700" style="border-radius: 5px; border: 1px solid #29622d;">
为了让逻辑简单,我们假设玩家的身体没有左右倾斜,那么我们就可以只用这4个部位的x坐标计算距离:- 膝盖距离 = 右膝x坐标 - 左膝x坐标
- 胯部距离 = 右胯x坐标 - 左胯x坐标
第5步 - 读取表格
现在我们新建4个变量来表示这4个身体部位的x坐标:“左胯x”、“左膝x”、“右胯x”、“右膝x”。
我们可以从表格“i”读取变量的值。再次勾选表格“i”的勾选框来查看内容。例如左胯的x坐标,我们先找到“X”列,然后找到其行号为12:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/9fbcfc48-51c3-4c06-8b09-3fe970bdc235.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
那么,我们就可以把这个值读取到变量“左胯x”,如下所示:
读取这4个变量的积木如下所示:
第6步 - 计算距离
我们得到了4个身体部位的x坐标,现在可以计算膝盖之间的距离、胯部之间的距离。
新建2个变量“膝盖距离”、“胯部距离”,来表示这两个距离。
“胯部距离”就是右胯与左胯的x坐标之差:

同理,膝盖距离就是右膝盖与左膝盖的x坐标之差。这一步做完后的完整程序如下所示:
第7步 - 根据距离计算姿势
我们的程序知道了这2个距离,现在就可以对比二者以判定玩家是否为深蹲姿势。我们可以用一个简单规则:如果膝盖距离大于跨步距离的两倍,就算是一个好的深蹲姿势。
新建一个变量“姿势”,将其默认值设为“未知”。如果膝盖距离大于胯部距离的两倍,我们就把“姿势”设为“深蹲”。

第8步 - 重新编排积木
因为我们添加的所有新积木都为了计算玩家姿势这一个目的,我们应该制作一个新积木。新积木命名为“计算姿势”,然后把所有新积木移动到这个积木的定义中:

第9步 - 防备无效值
如果摄像头影像检测不到身体部位,表格中的对应项就将被设为-10000。如果胯部、膝盖的x坐标这4个变量有一个为-10000,这些数据就作废无效。
因此,我们应当再添加一些逻辑来忽略无效数值,比如要求全部4个变量大于-250。提示,如果舞台上能看到身体部位,那么x坐标就一定大于-240。

第10步 - 重复不断计算姿势
当玩家移动并修改姿势后,表格“i”中的数值将持续不断更新。因此,我们应当重复不断计算玩家的姿势,可以用一个无限循环来完成:

第11步 - 检查是否为“深蹲”姿势
现在我们可以重复不断检查变量“姿势”的值。一当该值变为“深蹲”,我们就展示一条成功消息。

运行程序后得到如下结果:
第12步 - 设置目标姿势
现在我们把基本的游戏机制做出来了,下一步就是让游戏更有趣。我们给玩家提供多个目标姿势,玩家要尝试完成这些姿势来得分。
第一步,我们新建一个变量“目标姿势”,表示玩家要做的下一个目标姿势。
我们可以用这个新变量重新编写代码:

第13步 - 将目标姿势在“深蹲”和“站立”之间切换
当用户完成目标姿势后,我们就应当把目标换成一个新姿势。简便起见,我们让目标在这两个姿势之间切换:“深蹲”和“站立”。
我们可以为此制作一个新积木“切换目标姿势”。如果“目标姿势”为“深蹲”,那么下一个目标应当为“站立”。否则,如果“目标姿势”不是“深蹲”,那一定是“站立”,那么我们就要切换回“深蹲”。

第14步 - 制作“站立”造型
为了显示出目标姿势改变了,我们也要更换角色的造型。
找到“多利亚-c”造型并添加到角色中,重命名为“站立”。

我们还需要为这个造型做一些细微调整。原来左边的腿向旁边伸出,我们可以选中整条腿并旋转到直立位置:
此外,头部侧视,可能会让玩家感到迷惑。我们只需删除这个头部,然后从“深蹲”造型复制一个头:
第15步 - 切换造型
当我们切换“目标姿势”,同时也要切换造型,从而使玩家看到下一步做什么姿势:

第16步 - 视觉效果/听觉效果
当目标姿势切换完成后,为了给玩家清晰反馈,我们要展示一些视觉效果。例如,在切换至下一个造型之前我们可以让角色瞬间变亮。并且,我们还可以播放收集硬币的声音:

第17步 - 检测玩家是否为“站立”姿势
在积木“计算姿势”的定义中,目前我们只检查了是否为“深蹲”姿势。我们还要检查玩家是否为“站立”姿势。简便起见,我们还是看膝盖距离和胯部距离。如果玩家站立,膝盖距离应该比胯部距离稍大一点点。我们假设,当膝盖距离小于跨步距离的1.2倍时就算是站立:

现在游戏就做好了。每当玩家做出目标姿势,我们就切换至下一个目标姿势:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/6375abe6-43a0-42e8-b412-921e31f5af5a.gif" width="608" style="border-radius: 5px; border: 1px solid #29622d;">
创意扩展
在这个项目的基础上大家可以制作一些更有趣的东西:
-
游戏规则:大家可以设置不同的游戏规则。例如,大家可以为玩家设置时间限制(比方说1分钟),获得金币最多的玩家胜利。还可以要求玩家完成60次姿势,用时最短的获胜。
-
改进姿势检测方法:现在我们只看膝盖和胯部,大家还可以检查胳膊。比如,要求胳膊水平伸直,大家可以比较手腕和肩部的y坐标。
-
其他目标姿势:大家可尝试添加更多有趣的姿势。例如,让玩家做一个“X”姿势,如下图所示。需要用手腕和脚踝的x坐标和y坐标来检测这一姿势。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/31cb114d-7979-4809-aa66-c20cecbebd5b.png" width="400" style="margin-left: 40px; border-radius: 5px; border: 1px solid #29622d;">
- 双人模式:当有两个玩家站在摄像头前面时,两个人都能被身体姿势检测引擎所检测到,这使得大家能够制作双人游戏。例如,每当玩家A做一个姿势,这个姿势就作为玩家B的目标。这样的话,玩家B就要重复玩家A的姿势。
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login