MLKitPoseDetector 拓展:离线人体姿势检测(33 个关键点)

« 返回首页

logo MLKitPoseDetector 拓展

检测图片里人体的姿势,输出 33 个关键点(鼻、眼、耳、嘴、肩、肘、腕、手指、髋、膝、踝、脚) 的坐标和可信度。

为什么选它:

  • 完全离线。模型随 .aix 打包,设备不需要 Google Play 服务,断网也能用。
  • 33 个关键点带 z 深度和 inFrameLikelihood(该点在画面内的可信度), 可以过滤掉画面外/被遮挡的点。
  • 关键点带可读名称(LEFT_SHOULDER 这样),不用自己记索引编号。

常用场景:健身动作计数与姿态纠正、体感游戏、舞蹈/瑜伽动作比对、简单手势判断。

  • .aix 拓展下载:

cn.fun123.MLKit.PoseDetector.aix


快速上手

一、检测姿势并拿到关键点

when 图像选择器1.AfterPicking() {
  标签1.Text = "检测中…"
  PoseDetector1.DetectFromFile(图像选择器1.Selection)
}
when PoseDetector1.DetectionSuccess(resultJson, landmarkCount) {
  if landmarkCount > 0 {
    标签1.Text = join("检测到 ", landmarkCount, " 个关键点")
    标签_原始结果.Text = resultJson
  } else {
    标签1.Text = "没检测到人体"
  }
}
when PoseDetector1.DetectionFailed(operation, errorMessage) {
  标签1.Text = errorMessage
}

resultJson 的形状(用「JSON 文本解码」块解析):

{"landmarks":[{"type":0,"name":"NOSE","x":123.4,"y":56.7,"z":-12.3,"inFrameLikelihood":0.97},
              {"type":11,"name":"LEFT_SHOULDER","x":98.0,"y":150.2,"z":-8.1,"inFrameLikelihood":0.95}]}
  • x / y — 原图像素坐标(画到画布上要按比例换算)
  • z — 相对深度(越小越靠近镜头),用于判断前后关系
  • inFrameLikelihood — 该点在画面内的可信度,建议只用 > 0.5 的点

二、精确模式 vs 快速模式

when 按钮_精确.Click() {
  PoseDetector1.AccurateMode = true
  标签_当前模式.Text = "精确模式(更准更慢)"
}
when 按钮_快速.Click() {
  PoseDetector1.AccurateMode = false
  标签_当前模式.Text = "快速模式"
}

三、识别 Base64 图片

when 按钮_Base64.Click() {
  PoseDetector1.DetectFromBase64(文本输入框_Base64.Text)
}

33 个关键点名称

按 resultJson 里 name 字段的取值,从头到脚:

部位 关键点名
头部 NOSE、LEFT_EYE_INNER、LEFT_EYE、LEFT_EYE_OUTER、RIGHT_EYE_INNER、RIGHT_EYE、RIGHT_EYE_OUTER、LEFT_EAR、RIGHT_EAR、LEFT_MOUTH、RIGHT_MOUTH
上肢 LEFT_SHOULDER、RIGHT_SHOULDER、LEFT_ELBOW、RIGHT_ELBOW、LEFT_WRIST、RIGHT_WRIST
手部 LEFT_PINKY、RIGHT_PINKY、LEFT_INDEX、RIGHT_INDEX、LEFT_THUMB、RIGHT_THUMB
下肢 LEFT_HIP、RIGHT_HIP、LEFT_KNEE、RIGHT_KNEE、LEFT_ANKLE、RIGHT_ANKLE
足部 LEFT_HEEL、RIGHT_HEEL、LEFT_FOOT_INDEX、RIGHT_FOOT_INDEX

左右是以被拍摄者为准(不是画面左右)—— 自拍时会和你的直觉相反。


属性

AccurateMode
精确模式。「真」= 用更大的模型,更准但更慢;「假」= 更快。 单张照片分析建议用真,连续帧建议用假。
Busy
只读。是否正在检测。

事件

DetectionSuccess(resultJson,landmarkCount)
检测完成。landmarkCount 是关键点数量(可能为 0,表示没检测到人体,这不是错误); resultJson 含每个关键点的类型编号、名称、坐标和可信度(见示例一)。
DetectionFailed(operation,errorMessage)
检测失败。operation 是出错的方法名。

方法

DetectFromFile(path)
检测图片文件中的人体姿势。path 可以是素材文件名、设备路径、file:// 或 content:// 地址。
DetectFromBase64(base64)
检测 Base64 图片中的人体姿势。支持带 data:image/...;base64, 前缀的写法。

运行环境:AI 伴侣联机需要 Android 11 及以上

本拓展的识别模型放在依赖库自带的 assets 里,AI 伴侣联机调试要把它挂进 AssetManager,用的是 Android 11(API 30)才有的 ResourcesLoader —— 这是系统提供的 唯一公开办法,更低版本没有等价 API。所以:

运行方式 Android 6 ~ 10 Android 11 及以上
打包 APK ✅ 正常 ✅ 正常
AI 伴侣联机 ❌ 模型加载不了 ✅ 正常

打包 APK 之所以不受限制,是因为模型在编译时就被并进了 APK 的 assets,装到手机上 就是 App 自己的资源,与系统版本无关。伴侣的 APK 是提前编好装在手机上的,运行时没法 往自己已安装的包里加文件,只能靠系统的运行时挂载 API。

低版本设备上想验证功能,直接打包 APK 测即可;要用伴侣边改边调,请换 Android 11+ 的设备。

常见问题

landmarkCount 是 0。 没检测到人体。ML Kit 姿势检测要求画面里有较完整的人体(至少上半身), 且只检测一个人(最显眼的那个)。半身特写、只有手、多人混杂都容易失败。

关键点坐标画到画布上位置不对。 x/y 是原图像素坐标,画布是显示尺寸。要按 画布宽 / 原图宽 换算 —— 可以先用「图像」组件或读图取到原图尺寸。

左右反了。 左右是以被拍摄者为准,不是画面左右。自拍(前置摄像头镜像)时尤其容易搞混。

能检测多个人吗? 不能。ML Kit 姿势检测只返回画面里最显眼的一个人。多人姿势需要别的方案。

能做实时动作计数吗? 本拓展是单张图片模式。实时需要摄像头预览 + 逐帧检测 + 状态机计数, 可参考本仓库 MLKit.CodeScanner 的实时预览思路,但本拓展当前不提供该能力。

文档反馈