<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[人工智能 - 利用人体姿势检测做健身游戏（仅限高级版，难度：3级）]]></title><description><![CDATA[<p dir="auto"> </p>
<h2><a class="anchor-offset" name="用到的相关知识"></a>用到的相关知识</h2>
<ul>
<li><a href="/topic/279/%E5%8F%98%E9%87%8F%E7%AE%80%E4%BB%8B">使用变量</a></li>
<li><a href="/topic/628/%E8%AF%BB%E5%8F%96%E5%88%97%E8%A1%A8">读取列表</a></li>
<li><a href="/topic/566/%E5%9B%BE%E5%BD%A2%E7%89%B9%E6%95%88%E7%A7%AF%E6%9C%A8">图形特效</a></li>
<li><a href="https://www.forum.creaticode.com/topic/419/ai-for-body-part-recognition-premium-only" target="_blank" rel="noopener noreferrer nofollow ugc">肢体检测人工智能</a></li>
</ul>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="介绍"></a>介绍</h2>
<p dir="auto">在这篇教程中，大家将利用人体姿势检测做一个健身游戏。不同的姿势将显示在舞台上，玩家要以最快速度做出这些姿势。</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第1步-新建一个项目"></a>第1步 - 新建一个项目</h2>
<p dir="auto">在创益编程游乐场中新建一个项目。删除角色“角色1”，把角色“空的1”改名为“主角”。</p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第2步-运行身体部位检测"></a>第2步 - 运行身体部位检测</h2>
<p dir="auto">当点击绿旗时，我们要立即运行身体部位检测。这会打开摄像头并实时分析摄像头影像。大家要把“调试”设置为“是的”，就会自动显示身体关键部位。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b57a1734-f464-4a0e-9bdf-42af6d7ea48e.png" alt="1.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
在“变量”类别中会自动创建一个表格“i”。请勾选表格“i”前面的勾选框，使其在舞台显示：</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
然后运行程序。大家会看到身体关键部位被标记出来，表格“i”实时更新：</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第3步-添加深蹲造型"></a>第3步 - 添加深蹲造型</h2>
<p dir="auto">接下来，取消勾选表格“i”，添加一个“深蹲”姿势的造型。大家可以用造型“多利亚-d”，然后改名为“深蹲”：</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
把角色大小设为130，然后移动到舞台右下角。这是玩家的第1个目标姿势。</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第4步-分析这个深蹲姿势"></a>第4步 - 分析这个深蹲姿势</h2>
<p dir="auto">尽管我们知道每个<strong>身体部位</strong>的位置，但我们不知道玩家摆的是什么<strong>姿势</strong>。为了自动检测玩家是否是深蹲姿势，我们重点看这4个点位：左胯、右胯、左膝、右膝。</p>
<p dir="auto">主要观察点为，当玩家做深蹲姿势时，两个膝盖的距离要比左右胯部距离宽得多。</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
为了让逻辑简单，我们假设玩家的身体没有左右倾斜，那么我们就可以只用这4个部位的x坐标计算距离：</p>
<ul>
<li><strong>膝盖距离 = 右膝x坐标 - 左膝x坐标</strong></li>
<li><strong>胯部距离 = 右胯x坐标 - 左胯x坐标</strong></li>
</ul>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第5步-读取表格"></a>第5步 - 读取表格</h2>
<p dir="auto">现在我们新建4个变量来表示这4个身体部位的x坐标：“左胯x”、“左膝x”、“右胯x”、“右膝x”。</p>
<p dir="auto">我们可以从表格“i”读取变量的值。再次勾选表格“i”的勾选框来查看内容。例如左胯的x坐标，我们先找到“X”列，然后找到其行号为12：</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
那么，我们就可以把这个值读取到变量“左胯x”，如下所示：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c5eaff6a-4059-4328-aa83-88e8f3884ebe.png" alt="3.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
读取这4个变量的积木如下所示：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/35ea5780-f40d-4dfd-8d9b-7118885e28a6.png" alt="4.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第6步-计算距离"></a>第6步 - 计算距离</h2>
<p dir="auto">我们得到了4个身体部位的x坐标，现在可以计算膝盖之间的距离、胯部之间的距离。</p>
<p dir="auto">新建2个变量“膝盖距离”、“胯部距离”，来表示这两个距离。</p>
<p dir="auto">“胯部距离”就是右胯与左胯的x坐标之差：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b3d65590-5385-49a1-8080-16f1705c4720.png" alt="6.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
同理，膝盖距离就是右膝盖与左膝盖的x坐标之差。这一步做完后的完整程序如下所示：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7245b402-d14c-42dd-a9ef-7da6e45e6f8e.png" alt="5.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第7步-根据距离计算姿势"></a>第7步 - 根据距离计算姿势</h2>
<p dir="auto">我们的程序知道了这2个距离，现在就可以对比二者以判定玩家是否为深蹲姿势。我们可以用一个简单规则：如果膝盖距离大于跨步距离的两倍，就算是一个好的深蹲姿势。</p>
<p dir="auto">新建一个变量“姿势”，将其默认值设为“未知”。如果膝盖距离大于胯部距离的两倍，我们就把“姿势”设为“深蹲”。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/79401ab7-fd33-4773-8595-29b70f4a089c.png" alt="7.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第8步-重新编排积木"></a>第8步 - 重新编排积木</h2>
<p dir="auto">因为我们添加的所有新积木都为了计算玩家姿势这一个目的，我们应该制作一个新积木。新积木命名为“计算姿势”，然后把所有新积木移动到这个积木的定义中：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a0a5ea7f-eb17-4968-a7bf-b6d5927aae46.png" alt="8.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第9步-防备无效值"></a>第9步 - 防备无效值</h2>
<p dir="auto">如果摄像头影像检测不到身体部位，表格中的对应项就将被设为-10000。如果胯部、膝盖的x坐标这4个变量有一个为-10000，这些数据就作废无效。</p>
<p dir="auto">因此，我们应当再添加一些逻辑来忽略无效数值，比如要求全部4个变量大于-250。提示，如果舞台上能看到身体部位，那么x坐标就一定大于-240。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/730f77ae-2d78-4379-ae03-190dc1038f50.png" alt="9.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第10步-重复不断计算姿势"></a>第10步 - 重复不断计算姿势</h2>
<p dir="auto">当玩家移动并修改姿势后，表格“i”中的数值将持续不断更新。因此，我们应当重复不断计算玩家的姿势，可以用一个无限循环来完成：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/1527b8b1-02e2-41e5-be94-f58e537b8cfa.png" alt="10.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第11步-检查是否为-深蹲-姿势"></a>第11步 - 检查是否为“深蹲”姿势</h2>
<p dir="auto">现在我们可以重复不断检查变量“姿势”的值。一当该值变为“深蹲”，我们就展示一条成功消息。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/3ae813ff-e8d0-4d43-8245-33352862593f.png" alt="11.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
运行程序后得到如下结果：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/da8e2ea1-37b8-42a4-bcd5-ea13efe598e4.gif" alt="succ1.gif" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第12步-设置目标姿势"></a>第12步 - 设置目标姿势</h2>
<p dir="auto">现在我们把基本的游戏机制做出来了，下一步就是让游戏更有趣。我们给玩家提供多个目标姿势，玩家要尝试完成这些姿势来得分。</p>
<p dir="auto">第一步，我们新建一个变量“目标姿势”，表示玩家要做的下一个目标姿势。</p>
<p dir="auto">我们可以用这个新变量重新编写代码：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/47918c6e-2768-4372-bf25-64c5f9321561.png" alt="12.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第13步-将目标姿势在-深蹲-和-站立-之间切换"></a>第13步 - 将目标姿势在“深蹲”和“站立”之间切换</h2>
<p dir="auto">当用户完成目标姿势后，我们就应当把目标换成一个新姿势。简便起见，我们让目标在这两个姿势之间切换：“深蹲”和“站立”。</p>
<p dir="auto">我们可以为此制作一个新积木“切换目标姿势”。如果“目标姿势”为“深蹲”，那么下一个目标应当为“站立”。否则，如果“目标姿势”不是“深蹲”，那一定是“站立”，那么我们就要切换回“深蹲”。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/353eea2e-4e99-49f0-ae8f-827f7f9de981.png" alt="13.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第14步-制作-站立-造型"></a>第14步 - 制作“站立”造型</h2>
<p dir="auto">为了显示出目标姿势改变了，我们也要更换角色的造型。</p>
<p dir="auto">找到“多利亚-c”造型并添加到角色中，重命名为“站立”。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/044a4328-4f01-4f8a-8a80-a1ab33b6542d.png" alt="14.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
我们还需要为这个造型做一些细微调整。原来左边的腿向旁边伸出，我们可以选中整条腿并旋转到直立位置：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/2f028286-2b65-4752-a301-dc60a4475c4e.gif" alt="Animation3.gif" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
此外，头部侧视，可能会让玩家感到迷惑。我们只需删除这个头部，然后从“深蹲”造型复制一个头：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/41775352-6e69-4933-a842-f03dcc2ea1a0.gif" alt="Animation4.gif" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第15步-切换造型"></a>第15步 - 切换造型</h2>
<p dir="auto">当我们切换“目标姿势”，同时也要切换造型，从而使玩家看到下一步做什么姿势：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/81735981-2974-4b99-9c02-d591f9a453bb.png" alt="15.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第16步-视觉效果-听觉效果"></a>第16步 - 视觉效果/听觉效果</h2>
<p dir="auto">当目标姿势切换完成后，为了给玩家清晰反馈，我们要展示一些视觉效果。例如，在切换至下一个造型之前我们可以让角色瞬间变亮。并且，我们还可以播放收集硬币的声音：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fff7fcb0-75cf-4d79-abb1-a9d8e03ae4d9.png" alt="16.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第17步-检测玩家是否为-站立-姿势"></a>第17步 - 检测玩家是否为“站立”姿势</h2>
<p dir="auto">在积木“计算姿势”的定义中，目前我们只检查了是否为“深蹲”姿势。我们还要检查玩家是否为“站立”姿势。简便起见，我们还是看膝盖距离和胯部距离。如果玩家站立，膝盖距离应该比胯部距离稍大一点点。我们假设，当膝盖距离小于跨步距离的1.2倍时就算是站立：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5dcbf818-ec34-4240-8066-5d7d76c2b71b.png" alt="17.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
现在游戏就做好了。每当玩家做出目标姿势，我们就切换至下一个目标姿势：</p>
<p dir="auto"><img src="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" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="创意扩展"></a>创意扩展</h2>
<p dir="auto">在这个项目的基础上大家可以制作一些更有趣的东西：</p>
<ul>
<li>
<p dir="auto"><strong>游戏规则</strong>：大家可以设置不同的游戏规则。例如，大家可以为玩家设置时间限制（比方说1分钟），获得金币最多的玩家胜利。还可以要求玩家完成60次姿势，用时最短的获胜。</p>
</li>
<li>
<p dir="auto"><strong>改进姿势检测方法</strong>：现在我们只看膝盖和胯部，大家还可以检查胳膊。比如，要求胳膊水平伸直，大家可以比较手腕和肩部的y坐标。</p>
</li>
<li>
<p dir="auto"><strong>其他目标姿势</strong>：大家可尝试添加更多有趣的姿势。例如，让玩家做一个“X”姿势，如下图所示。需要用手腕和脚踝的x坐标和y坐标来检测这一姿势。</p>
</li>
</ul>
<p dir="auto"><img src="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" /></p>
<ul>
<li><strong>双人模式</strong>：当有两个玩家站在摄像头前面时，两个人都能被身体姿势检测引擎所检测到，这使得大家能够制作双人游戏。例如，每当玩家A做一个姿势，这个姿势就作为玩家B的目标。这样的话，玩家B就要重复玩家A的姿势。</li>
</ul>
]]></description><link>https://forum.creaticode.com/topic/950/人工智能-利用人体姿势检测做健身游戏-仅限高级版-难度-3级</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 03:05:41 GMT</lastBuildDate><atom:link href="https://forum.creaticode.com/topic/950.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Apr 2023 14:47:23 GMT</pubDate><ttl>60</ttl></channel></rss>