3 步跑通 MediaPipe Hands 手势追踪:从摄像头到 21 个关键点
3 步跑通 MediaPipe Hands 手势追踪:从摄像头到 21 个关键点
写一个"挥手切歌、抬手锁屏"的功能,最难的往往不是 UI,而是把手稳定地从画面里找出来:手指会挡住手掌、手会快速抖动,摄像头拍到的画面还没有明显特征。MediaPipe Hands 就是专门解决这个问题的:输入视频流或图片,输出每只手 21 个 3D 关键点的坐标,本地实时完成,图片本身不用出设备。
它是什么,硬指标有哪些
MediaPipe Hands 是 MediaPipe 框架里的手部检测与跟踪方案,内部由两个模型接力:先用手掌检测模型在整帧图里框出手掌区域,再用手部关键点模型在裁剪区域里回归出 21 个 3D 关节坐标。
- 单张图片即可推断出 21 个 3D 关键点,手掌检测平均精度(AP)95.7%
- 在手机端可实时运行,默认同时跟踪 2 只手,参数
max_num_hands可调 - 覆盖 Android、iOS、桌面(C++)、Web(JavaScript)、Python,边缘设备(如 Coral TPU)也有量化版本
- 关键点分两种输出:归一化坐标(0~1)和以米为单位的真实 3D 世界坐标,可直接用于手势判定
输入一帧画面,能拿到什么
手势控制应用。 输入是摄像头实时帧,得到的是每帧 21 个关键点加左右手判定(multi_handedness 输出 "Left"/"Right" 及置信分)。典型用法:比较指尖与手腕的相对位置判断手指弯曲程度,就能区分"石头/剪刀/布",再映射到切歌、缩放这类动作上。
手语与无障碍场景。 输入一段视频,得到连续轨迹上的关键点序列,外加以手部几何中心为原点的世界坐标。由于跟踪模式(static_image_mode=false 时默认启用)在手已定位后不再每帧重跑检测,延迟比逐帧检测低,适合做连续手势序列识别。
自定义手势识别模型。 仓库里的 Model Maker 手势识别器(gesture_recognizer)自带 4 个手势类别的示例数据集(call、four、none、rock),按"一个手势一个文件夹"组织图片,即可训练并导出自己的分类模型。
最短上手路径
第一步:装 Python 包,跑通追踪。
pip install mediapipe
然后用 docs/solutions/hands.md 里的 Python 示例代码:mp.solutions.hands 的 Hands 对象接上 OpenCV 摄像头帧,process() 之后从 results.multi_hand_landmarks 读关键点,draw_landmarks 画到手部骨架上,示例里连显示和翻转都写好了。
第二步:想看桌面原生效果,编译官方示例。 桌面版示例在 mediapipe/examples/desktop/hand_tracking/,用 Bazel 构建 hand_tracking_tflite 目标,再指定输入视频路径即可输出标注了关键点的视频。
第三步:按需扩展。 只需要手部检测框不需要关键点,换用 hand_detection_mobile.pbtxt 对应的图;要识别特定手势,就用 Model Maker 的 gesture_recognizer 重新训练。
常见疑问
精度够上生产吗? 手掌检测 AP 95.7%,关键点模型对部分遮挡和自遮挡(手指挡手掌)做过专门训练,手机端可实时跑,常规交互场景够用。对精度敏感时把 model_complexity 从 0 调到 1,精度和延迟都会上去,属于用延迟换精度的取舍。
换平台要重写吗? API 参数在各平台语义一致(max_num_hands、min_detection_confidence 等,命名风格略有差异),但各平台调用方式不同:Python/Android/iOS/Web 各有独立示例,核心逻辑是"送帧进去、取关键点出来",业务层手势判定代码可复用,平台接入层需要按对应示例写。
Legacy Solutions 还能用吗? 仓库文档注明 Legacy Solutions 于 2023 年 3 月 1 日起结束支持,新开发建议走 MediaPipe Tasks 的 Hand Landmarker API;本仓库的 Legacy 代码和预编译产物仍按"原样可用"维护,学习和参考不受影响。
下一步建议:先按 Python 示例把摄像头关键点跑起来,确认输出格式符合需求,再决定是否引入 Model Maker 定制手势类别。
更多推荐



所有评论(0)