尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MediaPipe Hands 手部追踪完全指南:5 分钟跑通 21 点 3D 手部关键点检测

MediaPipe Hands 手部追踪完全指南:5 分钟跑通 21 点 3D 手部关键点检测 MediaPipe Hands 手部追踪完全指南5 分钟跑通 21 点 3D 手部关键点检测【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipeMediaPipe Hands 是 Google 开源的手部追踪方案从单帧画面里实时找出双手的 21 个 3D 关键点。想给产品加手势交互、AR 或手语能力、又没有视觉背景的开发者看完这篇就能上手。为什么你需要手部追踪先找到手掌再数手指做个隔空操控功能听起来不难用户手一挥屏幕上的东西跟着动。真做起来才知道坑在哪——手这个东西是计算机视觉里出了名的难伺候对象。它经常自己挡自己手指盖住手掌晃起来毫无规律身上还没有人脸那种高对比度的五官可抓。你直接把整张图丢给一个大模型去猜所有手指的位置结果又慢又不准。MediaPipe Hands 的解法像侦察兵排雷先用手雷定位再蹲下来细看。第一步是找手掌。一个小而快的检测模型扫一遍全图圈出手掌的大致范围。手掌是相对刚性的块状物比张开五指的手好认得多。第二步是数手指。把圈出来的那块区域裁下来交给高精度模型回归出 21 个 3D 关节坐标。类比一下你要在足球场里找一个人是先扫全场锁定位置找手掌还是先放大到那个人脸再确认数手指两阶段都干了但只做一次贵的。更聪明的地方在于视频模式第 2 帧之后它直接用上一帧的关键点算出裁剪区域不再全图重搜。只有当追踪丢失、模型跟丢手了才会回到全图找手掌那一步。就像你盯住熟人走路目光会跟着他移动而不会每个瞬间都重新搜一遍整个房间。这套流水线在仓库里对应的图就是 hand_tracking 的 pbtxt 配置。能力展开手部追踪能帮你做什么拿到 21 个点之后能玩出的花样比想象的多。AR 里的虚拟遥控器。每个点的 x、y 都归一化到 [0, 1]z 表示深度以手腕为原点值越小越靠近镜头。这意味着你不仅能知道手指在画面哪个位置还知道它离摄像头多远。把虚拟戒指、菜单面板戴到指尖上靠的就是这套坐标。另外输出的世界坐标是以米为单位的真实 3D 尺度AR 场景里做尺寸对齐特别省事。手势控制。不需要训练什么花哨的模型很多手势用 21 个点的几何关系就能判食指和中指伸直、其余握紧就是剪刀手五指张开就是掌。把点的运动轨迹连成时序上滑下划这种指令也能做出来PPT 翻页、智能家居控制都成立。手语识别。单手 21 点加上随时间的变化就是一组结构清晰的手语特征序列接一个分类模型手语到文本的实时翻译就有了地基。左右手识别。输出里自带 handedness 字段告诉你这是 Left 还是 Right附一个置信度分数。⚠️ 有个容易踩的坑这个判断假设输入是镜像翻转过的自拍画面。如果你用的是普通摄像头、没做镜像左右结果要自己手动对调不然用户举右手它会说 Left。上手环节一条命令安装5 分钟跑通第一个例子 环境准备就一行pip install mediapipe下面是能跑的最小示例打开摄像头实时画出手部骨架import cv2 import mediapipe as mp hands mp.solutions.hands.Hands( max_num_hands2, # 最多同时追踪 2 只手 model_complexity0, # 选轻量级关键点模型速度优先 min_detection_confidence0.5) # 检测成功的置信度门槛 cap cv2.VideoCapture(0) # 打开摄像头 while cap.isOpened(): ok, frame cap.read() if not ok: continue frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 先转 RGB 再喂给模型 results hands.process(frame) # 核心就这一步 if results.multi_hand_landmarks: # 每只手 21 个点的列表 for lm in results.multi_hand_landmarks: mp.solutions.drawing_utils.draw_landmarks( frame, lm, mp.solutions.hands.HAND_CONNECTIONS) # 画出 21 点和骨架连线 frame cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) cv2.imshow(MediaPipe Hands, frame) if cv2.waitKey(5) 0xFF 27: # 按 ESC 退出 break cap.release()运行后你会看到画面里每只手被 21 个点标出点之间用线连成手指骨架手指一动点就跟着动。这就通了。参数避坑每个旋钮拧动会发生什么⚙️ 所有参数都在初始化Hands()时传入。下表把每个旋钮的后果标清楚参数默认值作用调高的后果调低的后果static_image_modefalse把输入当视频流还是逐帧独立图片设true每帧都全图重检测适合处理一批互不相关的静态图但延迟明显上升设false帧间复用上一帧结果持续追踪计算省、延迟低适合视频max_num_hands2最多追踪几只手更大多人场景可用计算量随之增加1最快但画面里出现第二只手就不管了model_complexity1关键点模型档位只有0/1两档1坐标精度更高推理更慢0速度快一截精度略降多数交互场景够用min_detection_confidence0.5检测成功的置信度门槛更高误报少但手在画面边缘或模糊时可能直接漏检更低手更容易被看见代价是背景里的干扰物可能被误判成手min_tracking_confidence0.5追踪成功的置信度门槛低于它就触发一次全图重检测更高追踪更稳但重检测触发更频繁延迟随之上涨更低几乎不重检测、延迟低但手被短暂遮挡后可能跟丢、位置漂移两条经验默认值就够了别乱动。0.5 / 0.5 是官方默认视频场景保持static_image_modefalse先把流程跑顺再针对具体场景微调。提速实战把延迟打下来的三个办法⚡ 嫌慢的时候按这个顺序动手性价比从高到低model_complexity0。关键点模型直接换轻量档是单步推理延迟下降最直接的方式交互类应用手势控制、游戏通常感知不到精度损失。让视频模式真正生效。确认static_image_modefalse并且喂给它的是一路连续帧。这样大部分帧只走裁剪区域 关键点模型最贵的全图手掌检测只在丢失时触发。处理一批孤立图片时反而要把它设成true否则帧间复用逻辑会帮倒忙。减少每帧的额外开销。官方示例里有这么一行image.flags.writeable False让 OpenCV 以引用传图、避免拷贝画完标注再改回True。移动端部署的话Android/iOS 端开启runOnGputrue把整条流水线和推理都搬到 GPU 上收益比桌面端更明显。更多细节和平台差异JS、Android、iOS 的 API 名略有不同可以翻一下 官方 hands 文档。一条命令装好、十几行代码跑起来、每只手 21 个 3D 点实时到手——MediaPipe Hands 把让计算机看懂手这件事的门槛压到了相当低的位置。下一步不如就把摄像头打开让你的第一个手势指令动起来吧。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表