MediaPipe Hands:从摄像头到手势识别,三步跑通实时手部追踪
2026/9/19 6:00:40 网站建设 项目流程

MediaPipe Hands:从摄像头到手势识别,三步跑通实时手部追踪

【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe

不用数据手套,也不用深度相机,一个普通摄像头就够了。MediaPipe Hands 是谷歌的实时手部追踪方案:一帧画面里锁定双手,每只手输出 21 个 3D 关键点,整套流水线能在端侧跑起来,手机端也不例外。

它为什么不会丢手?

关键在这套东西不直接在整张图里"找手",而是两段式流水线:第一级是掌部检测器,在整图上输出掌心的带方向包围框;第二级是关键点模型,只吃裁剪出来的那块图,直接回归 21 个关节坐标。

为什么检测掌心而不是手?因为掌心是刚体,包围框比"张着五指的手"稳定得多,连握手这种自遮挡情况,非极大值抑制也能把两只手分开。

还有个细节值得说:视频模式下并不是每帧都跑全图检测。上一帧的关键点会直接复用去生成裁剪框,只有当关键点模型"跟丢"了,才回调全图检测重新定位。这是它快速移动、手指互相遮挡时依然稳的主要原因。官方论文里掌部检测器 AP 做到 95.7%,去掉 decoder 只有 86.2%。

3 步跑通第一个手部追踪

装包就一行:

pip install mediapipe

最小可跑的代码就几行:

import mediapipe as mp with mp.solutions.hands.Hands() as hands: results = hands.process(image)

results.multi_hand_landmarks是每只手 21 个归一化的 (x, y, z) 点,multi_handedness还会告诉你左右手和置信度。画骨架用现成的mp.solutions.drawing_utils就行。

这里其实有个坑:legacy solutions 里的 Hands API 已经被标记为旧版,新代码建议走 Tasks 版HandLandmarker,源码在 mediapipe/tasks/cc/vision/hand_landmarker/。max_num_hands、置信度阈值这些配置项两边基本一致,迁移成本不高。

21 个点够不够用?

输出比你想的多。除了归一化屏幕坐标,还有world coordinates:以米为单位的真实 3D 坐标,原点在手掌几何中心。这意味着你能算两只手的相对姿态,甚至估算手指间的真实距离。

手势识别就是建立在这之上:"石头剪刀布"看手指弯曲角度,"出 4" 看指尖相对高度。想加自定义手势(比如"竖大拇指点赞"),看 mediapipe/model_maker/python/vision/ 里的 gesture_recognizer 示例,自己标几张图就能微调。

模型本身只有几 MB,lite 版掌部检测器就是给移动端设计的,直接塞进 App 没问题。

想深挖去哪看?

  • 图定义(移动端/桌面、CPU/GPU 版本,.pbtxt 可直接粘到 visualizer):mediapipe/graphs/hand_tracking/
  • 子模型:mediapipe/modules/palm_detection/、mediapipe/modules/hand_landmark/
  • 桌面可运行示例:mediapipe/examples/desktop/hand_tracking/

C++ 完整流水线而不是只调 Python API,就从 examples/desktop 下的 hand_tracking_cpu 目标入手,图里改一下 NUM_HANDS 就能支持 3 只手以上。

想动手的话,先把上面那段 Python 跑起来,再去翻翻 examples/desktop/hand_tracking/ 里的骨架图——几秒钟,你屏幕上就会出现一只带骨架的手。

【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询