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 的实时预览思路,但本拓展当前不提供该能力。
扫码添加客服咨询