MediaPipe 手部关键点检测实战:21 个关键点、2 只手、30 秒跑通摄像头 Demo
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
MediaPipe Hands 是 MediaPipe 项目里的跨平台手部关键点检测工具:每只手输出 21 个 3D 关键点,并附带左右手判定,手机端也能实时跑。这篇入门指南带你 30 秒内跑通一个摄像头 Demo,再讲清每个参数该怎么调。
能力速览:它是什么,能给你什么
| 维度 | 内容 |
|---|---|
| 它是什么 | 基于 MediaPipe 图计算的 ML 方案,输入一张 RGB 图,输出手部骨架 |
| 核心输出 | 每只手 21 个归一化 3D 关键点(x、y 在 0–1 之间,z 表示相对深度);真实世界的米制坐标(原点在手的几何中心);左右手标签与置信度 |
| 关键指标 | 单只手 21 点,默认最多同时 2 只手,模型复杂度 0/1 两档可选 |
| 运行平台 | Python、JavaScript、Android、iOS,另有 C++/C API,pip install mediapipe即可 |
上面这张手势图,就是典型的手势识别入门素材:手部清晰、背景简单,正好适合拿来验证检测效果。
最快上手步骤:安装 + 20 行代码看效果
装环境只需要一条命令:
pip install mediapipe然后保存下面这段脚本,运行就能看到效果:
import cv2 import mediapipe as mp mp_hands = mp.solutions.hands hands = mp_hands.Hands(max_num_hands=2, model_complexity=1) cap = cv2.VideoCapture(0) while cap.isOpened(): ok, frame = cap.read() if not ok: break rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) res = hands.process(rgb) if res.multi_hand_landmarks: for lm in res.multi_hand_landmarks: mp.solutions.drawing_utils.draw_landmarks( frame, lm, mp_hands.HAND_CONNECTIONS) cv2.imshow('MediaPipe Hands', frame) if cv2.waitKey(5) & 0xFF == 27: break cap.release()窗口里每只手会画出 21 个点加连线骨架;按 ESC 退出,没有手时画面保持原样。
参数调优手册:五个核心配置逐项看
| 参数 | 作用 | 建议值 | 说明 |
|---|---|---|---|
static_image_mode | 按视频流还是静态图处理 | 视频流False;处理零散图片改True | 默认False。True时每帧都走完整检测,不做帧间跟踪 |
max_num_hands | 同屏最多追踪几只手 | 2 | 默认 2,够覆盖双手操作;调大会增加计算量 |
model_complexity | 关键点模型档位,0或1 | 移动端0,桌面1 | 默认1。档位越高,精度和延迟一起上升 |
min_detection_confidence | 手掌检测模型的最低置信度 | 0.5 | 检测阶段用,范围 0–1,太高会漏检 |
min_tracking_confidence | 关键点跟踪的最低置信度 | 0.5 | 低于它会自动重新检测;静态图像模式下无效 |
进阶要点:视频流模式为什么快
默认的视频流模式只在一开始跑一次手掌检测;之后每一帧都直接拿上一帧的 21 个关键点生成裁剪区域,只跑关键点模型,跳过手掌检测。只有当跟踪置信度跌破min_tracking_confidence、判定"跟丢了",才重新调用手掌检测重新定位。这套"能跟就不检"的策略,正是它能在手机上保持实时帧率的核心原因。
场景与避坑清单
常见用法,一行一个:
- AR 手势交互:虚拟试戴、空中点选
- 手势控制:智能家居、游戏输入的隔空操作
- 手语翻译:把关键点序列喂给分类模型
- 姿态数据集构建:批量抽取手部坐标做下游训练
跑 Demo 时最常踩的三个坑:
- 输入必须是 RGB。OpenCV 读出来是 BGR,不转换就
cvtColor一下,否则关键点飘、颜色怪。 - 电脑同时插着摄像头和采集卡时,
VideoCapture(0)不一定拿得到你想要的那路,换1试试。 - 手总是检测不到?大概率是置信度阈值开太高,先把两个阈值降到 0.3–0.4 确认链路通了再调回去。
写在最后
装好包、贴进 20 行代码,21 个 3D 关键点、双手同屏和左右手判定就都到手了;参数按上表微调,视频流模式默认帮你把延迟压住。想深入可以看官方文档 docs/solutions/hands.md 和 Python 安装说明 docs/getting_started/python.md,图计算源码在 mediapipe/modules/hand_landmark/ 和 mediapipe/graphs/hand_tracking/。
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考