MediaPipe 手部追踪实战指南:从21个关键点到实时手势识别
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
MediaPipe 是跨平台 ML 推理框架,手部追踪方案能从单张 RGB 图像实时输出 21 个手部关键点与左右手判定。适合想把手势做进桌面、Web 或移动端应用的开发者。本文以 Python 为例,10 分钟跑通。
核心能力
⚡ 手部追踪不是单个模型,而是两段式小图:先定位手掌,再在局部区域里出关键点。两个模型都不大,单帧开销可控。
- 一次调用拿到三样东西:21 个关键点的图像坐标、真实世界 3D 坐标(单位米)、左右手标签。
- 多手与视频流:
max_num_hands控制手数量;视频模式下用上一帧关键点做先验,帧间不会反复重置。 - CPU/GPU 可切换:同一套逻辑有 CPU 和 GPU 两种执行图,手部关键点模块 里能看到对应的 pbtxt 配置。
上图是检测类任务在设备端的运行示意:输入一帧画面,输出带标注框的结果。手部追踪的产出形式类似,只是框变成了 21 个关键点。
五分钟跑通第一个例子
Python 端实时手部追踪最小示例(OpenCV + MediaPipe Solutions)
import cv2 import mediapipe as mp hands = mp.solutions.hands.Hands(model_complexity=1, max_num_hands=2) cap = cv2.VideoCapture(0) while cap.isOpened(): ok, frame = cap.read() if not ok: break frame = cv2.flip(frame, 1) # 先镜像,左右手判定才正确 result = hands.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) if result.multi_hand_landmarks: mp.solutions.drawing_utils.draw_landmarks( frame, result.multi_hand_landmarks[0], mp.solutions.hands.HAND_CONNECTIONS) cv2.imshow("hands", frame) if cv2.waitKey(5) & 0xFF == 27: break几个容易踩的点:
model_complexity只有 0 和 1 两档(源码注释明确写了):0 轻快,1 精确但更慢。- 关键点编号固定:0 是腕部,1-4 拇指,5-8 食指,9-12 中指,13-16 无名指,17-20 小指,映射定义在 Python Hands 方案 的
HandLandmark枚举里。 process只收 RGB 的 numpy 数组,OpenCV 读出来是 BGR,记得转。
内部机制:两段式检测
MediaPipe 用图来执行一切,图里每个节点叫 Calculator,负责处理一类数据。手部追踪图的骨架如下:
- 为什么分两段:全帧检测只回答"有没有手、在哪",模型可以做得很小;定位后裁出 ROI(感兴趣区域,即手的局部放大图),再交给更精细的关键点网络。总耗时低于直接上一个大模型。
- 为什么帧间稳:
static_image_mode=False时,上一帧关键点会作为输入喂给网络,当前帧预测被往上一帧方向拉,抖动被压住。 - 左右手标签有前提:handedness 按镜像图(自拍模式)计算。你喂的是普通横拍图,标签会左右反。
高频坑点与一行修复
- 现象:左右手标签反了。原因:handedness 假设输入是镜像图。修复:
frame = cv2.flip(frame, 1)后再 process。 - 现象:帧耗时高,低端设备掉帧。原因:
model_complexity=1是重模型。修复:Hands(model_complexity=0)。 - 现象:快速移动或遮挡时轨迹断、抖动。原因:跟踪置信度阈值偏高,低置信帧被丢弃。修复:
min_tracking_confidence=0.3,按场景往下调。 - 现象:处理单张图,第二次调用结果漂移。原因:默认
static_image_mode=False在引用上一帧先验。修复:Hands(static_image_mode=True)。
调参顺序建议:先降阈值,再换轻模型,最后才考虑图像预处理。别一上来就动模型。
进阶入口
- 从关键点到手势类别:Tasks API 的 GestureRecognizer 直接输出手势分类结果,实现在 GestureRecognizer 任务。
- 从 Python 到其他平台:把执行图换成移动端 GPU 版本即可,配置在
mediapipe/graphs/hand_tracking/目录下。
写在最后
二十行代码就到手部追踪地基。下一步读一读手部追踪官方文档,把平滑和手势分类加进你的业务流程。
参考链接
- 手部追踪方案文档
- 手部关键点模块
- Python Hands 方案源码
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考