
手部追踪实战教程用 MediaPipe Hands 拿到 21 个 3D 关键点【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe短视频里挥挥手指就完成隔空点选、虚拟试戴里戒指能跟着手指转动——这些画面背后都是同一件事让程序从摄像头画面里看见你的手指尖、指关节和手腕。MediaPipe Hands 就是为这件事而生的开源手部追踪方案输入普通相机画面实时输出每只手 21 个带深度信息的 3D 手部关键点。一分钟认识这个项目MediaPipe 是 Google 维护的一套跨平台机器学习框架本仓库即是其代码主体Hands 是其中封装好的手部追踪模块。它解决的核心问题是在没有深度相机、没有数据手套的普通设备上稳定地定位多只手并读出每只手的精细姿态。项目说明输入一张 RGB 图像摄像头帧、视频帧或单张静态图输出每只手 21 个 3D 关键点 左右手标签及置信分核心能力实时手部追踪、手部关键点检测支持多手同时追踪适用平台Python、C、Android、iOS、JavaScript浏览器坐标系x、y 归一化到 0~1z 表示相对手腕的深度关键点怎么数1 个手腕 5 根手指 × 4 个关节腕掌、近指间、远指间、指尖 21 个。坐标不直接用像素而是把整张图当成一把 0 到 100% 的坐标尺指尖在画面宽度 30% 的位置x 就是 0.30。这样无论 720p 还是 4K 画面同一手势的数值几乎不变画图或做手势判断时都省事。它是怎么工作的把检测过程想象成在人群里找到某个人再看清他长相先找掌圈出范围。手掌检测模型扫描整张图在可能的手掌位置画一个框。这一步只回答手在哪儿。再放大精测点位。关键点模型只处理刚才那个小框裁剪出来的手部区域直接回归出 21 个坐标。第二步是整个设计的关键。关键点模型在小裁剪图而不是整张大图上运行算量小得多而且裁剪图已经对齐了——手的大小、朝向、位置变化都被前一步消化掉了模型可以把全部容量花在把 21 个点测准上。视频流还有一层省算力的机制连续帧之间当前帧的裁剪区域直接由上一帧已算出的关键点推出相当于眼睛跟着目标走根本不用重新找人。只有当关键点模型连续判断这只手找不到了比如手快速移出画面、被完全遮挡才会重新唤起手掌检测器重新定位。一次全图搜索的成本被摊薄到了偶尔一次。上图是仓库测试集里的一张普通照片手占画面比例不大、背景杂乱——对这套先圈后测的管线来说这正是日常要处理的典型场景。5分钟跑起来pip install mediapipe一条命令装好 Python 包后下面这段就是最小可运行的摄像头示例回车Esc退出import cv2, mediapipe as mp hands mp.solutions.hands.Hands( static_image_modeFalse, max_num_hands2, min_detection_confidence0.5, min_tracking_confidence0.5) cap cv2.VideoCapture(0) while cap.isOpened(): ok, frame cap.read() if not ok: break frame cv2.cvtColor(cv2.flip(frame, 1), cv2.COLOR_BGR2RGB) r hands.process(frame) for lm in (r.multi_hand_landmarks or []): mp.solutions.drawing_utils.draw_landmarks( frame, lm, mp.solutions.hands.HAND_CONNECTIONS) cv2.imshow(hands, cv2.flip(frame, 1)) if cv2.waitKey(5) 0xFF 27: break cap.release()需要理解的参数其实就 5 个static_image_modeFalse默认表示输入是连续视频帧启用上一帧追踪、丢失才重检的省算力模式True表示每帧都是彼此无关的静态图每帧都走完整检测。max_num_hands最多追踪几只手默认 2。min_detection_confidence手掌检测的置信度门槛低于 0.5 的手不认。min_tracking_confidence跟踪阶段的置信度门槛低于它的手会触发下一帧重新检测。model_complexity0 或 1越大越准也越慢默认 1。另外两处细节别漏cv2.flip(frame, 1)把画面镜像既符合自拍视角也让左右手输出符合直觉该方案默认输入是镜像的自拍图BGR 转 RGB 是因为 MediaPipe 只吃 RGB。踩坑与调参问答问置信度到底调高还是调低两个阈值方向相反地影响体验。min_detection_confidence调高漏检变少但更认生——手离镜头太远、光线暗时容易整只手丢失调低则相反可能出现把手边的物体误判成手。建议从 0.5 起步如果追踪中手频繁消失先降min_tracking_confidence到 0.3~0.4比动检测阈值见效快因为它直接决定多容易放弃跟踪、重新全图搜索。问静态图批处理和摄像头流参数要一样吗不一样。批处理一堆照片时把static_image_mode设为True此时min_tracking_confidence完全失效没有上一帧可依赖只留检测阈值起作用。摄像头或视频流就保持默认的False帧间追踪优化才能生效。问多手追踪有什么坑max_num_hands建议不超过 4。两只手互相遮挡比如握手、十指交叉时关键点可能短暂串手或抖动这是模型对自遮挡的正常表现跟踪置信度会相应下降并触发重检。如果业务要求每只手身份稳定区分这是左手那只别指望单次输出需要自己按位置做跨帧匹配。问结果一跳一跳的怎么平滑关键点检测本身带少量抖动做手势判断前通常再叠一层滤波——对 21 个点的坐标做指数滑动平均新值权重 0.7 左右就能明显改善时序类任务手势分类则直接取滑动窗口特征比逐帧滤波更稳。能用在哪些地方游戏里的空气手柄。把 21 个点当一组零硬件输入拇指与食指捏合的 z 轴距离作为点击手掌朝向作为摇杆轴。相比摄像头数据手套这套方案的门槛只是任何一台带摄像头的电脑延迟在几十毫秒量级本地推理即可。教育场景的可见化输入。语言课上老师演示国际音标的口型和手势、编程课上学生隔空比划代码结构——手部关键点让用手比着讲第一次变得可记录、可回放。21 个点连成的骨架图本身就是很好的演示素材学生能直观看到每根手指的角度变化。无障碍交互。对精细动作受限的用户一套粗略手势张开/握拳/指向就可以替代点击和拖拽配合屏幕上的光标渲染即可搭出可用的输入通道。这里恰恰是准不如稳重要宁可手势判断保守一点也不能光标乱跳。接下来可以玩什么手部追踪只是起点。同一套 MediaPipe 里还有姿态pose和面部网格face_mesh方案mp.solutions.holistic可以把人脸、双手、全身姿态一次跑完适合做整体人体交互想要更省资源时把model_complexity降到 0 或换用仓库中 palm_detection 模块 的轻量检测器只出框、不出点是常见做法。如果你的手势集比较特殊比如行业专用手势仓库里的 model_maker 支持用标注数据重新训练手势分类模型和本文的关键点管线正好互补。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考