屏幕上画出一只手,21个关节点连成骨架,看起来这事就成了。真去飞一台无人机才发现,能看见手只是开始。中间那段路——从"我看得见你的手"到"飞机做了你想让它做的,没做你没让它做的"——才是真正要啃的部分。
手部姿态估计到底在估什么
![]()
人体姿态估计做的事,是在图像或视频里检测并追踪身体各部位的位置,比如肘、肩、膝这些关节,用计算机视觉找出关键点,再据此推断姿态。手部姿态估计是同一个思路,只是把目标换成了手。
有个容易让人想歪的地方值得说清楚:模型并不是在理解解剖结构。它是拿标注好的关键点训练出来的——这个像素是某个指节,那个是手腕——然后直接预测这些点的位置。屏幕上那只"骨架",不过是把预测出来的点连起来的线,底下并没有什么骨骼模型。
手是特别合适的控制界面。它是人体最灵活的部分,我们本来就用手做精细复杂的操作;它可以脱离身体其他部位被单独追踪,不需要把整个人框进画面。MediaPipe 的手部模型每只手追踪21 个关键点:指节、手指关节、指尖和手腕。这个分辨率足够区分握拳、张开手掌和伸出食指。这 21 个点组成的向量,就是后面所有环节的原材料。
第一步:把手的关键点检测出来
MediaPipe 是谷歌开源的框架,用来在音频和视频上搭建实时机器学习流水线。经典的手部追踪入口,一条 pip 命令就能装好:pip install mediapipe opencv-python。
下面这段摄像头循环会检测并画出手部关键点。原始的浏览器和 asyncio 脚手架被剥掉了,因为这段代码跑在你自己的机器上,不是在 Pyodide 里:
mp.solutions.hands初始化手部检测,max_num_hands=1,只认一只手,避免控制时的歧义- 检测置信度设为
0.7,追踪置信度设为0.5 - 打开摄像头,逐帧读取,然后水平翻转画面,让左右方向符合直觉
- 把 BGR 转成 RGB,送进
hands.process() - 如果检测到手部关键点,就用
draw_landmarks把骨架画在画面上 q退出循环,释放摄像头并关闭窗口
这里有个重要的提醒。mp.solutions.hands属于旧的 Solutions API。谷歌已经在2023 年 3 月 1 日停止对旧版 MediaPipe Solutions 的主动支持,把一切都迁移到了 MediaPipe Tasks API。
换句话说,上面这段能跑,但它站在一条已经不再被维护的路上。真要做产品,得往 Tasks API 那边走。这一步本身不难,难的是别在旧接口上把后面的逻辑全搭起来,回头再拆一遍。
看得见手,和飞得对,是两件事
检测只是第一段。整条链路要解决的问题是:手在动,飞机得动得对。手不动的时候,飞机不能自己飘;手做一个动作,飞机得理解成对应的指令,而不是别的什么。
这就是为什么"屏幕上画出骨架"给人的完成感是假的。骨架只是把 21 个点连起来,它不告诉你握拳意味着什么,也不告诉你手抖了一下该不该算指令。这些判断全在后面两段里。
如果只是想做检测,第一段单独拿出来就够了。但如果真想飞点什么,三段都得走完。中间那些看起来琐碎的环节——阈值、滤波、动作到指令的映射——才是决定这台东西能不能用的地方。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.