ML 姿态检测

在 Flutter 中使用 ML Kit 进行姿态检测的简便方法。

ML Kit 姿态检测是一个轻量级、多功能的解决方案,可供应用开发者实时检测用户身体的姿态,无论是来自连续视频还是静态图像。

姿态是指身体在某一时刻的位置,由一组骨骼地标点组成。地标点对应于身体的不同部位,例如肩膀和臀部。地标点的相对位置可用于区分不同的姿态。它会产生一个包含 33 个点的全身骨骼匹配,其中包括面部地标(耳朵、眼睛、嘴巴和鼻子)以及手和脚上的点。

ML Kit 姿态检测无需专门的设备或机器学习专业知识即可取得优异的成果。借助这项技术,开发者只需几行代码即可为用户创造独一无二的体验。

为了检测姿态,用户的脸必须可见。姿态检测在被摄对象的整个身体都可见时效果最佳,但它也能检测部分身体姿态。在这种情况下,未识别的地标点将被赋予图像外部的坐标。

universe

入门

将依赖项添加到您的 flutter 项目

$ flutter pub add learning_pose_detection

或者

dependencies:
  learning_pose_detection: ^0.0.1

然后运行 flutter pub get

用法

import 'package:learning_pose_detection/learning_pose_detection.dart';

输入图像

与其他 ML 视觉插件一样,输入是以 InputImage 实例的形式提供的,该实例是 learning_input_image 包的一部分。

您可以从 learning_input_image 使用 InputCameraView 小部件作为处理来自相机/存储的图像(或图像流)到 InputImage 格式的默认实现。但如果您想创建自己的自定义实现,请随时了解 InputCameraView 内部代码。

以下是使用 InputCameraView 获取用于姿态检测的 InputImage 的示例。

import 'package:learning_input_image/learning_input_image.dart';

InputCameraView(
  title: 'Pose Detection',
  onImage: (InputImage image) {
    // now we can feed the input image into pose detector
  },
)

姿态检测

在获取 InputImage 后,我们可以通过调用 PoseDetector 实例的 detect 方法来开始检测用户的姿态。

PoseDetector detector = PoseDetector();
Pose? pose = await detector.detect(image);

输出

姿态检测过程的输出是 Pose 对象,其中包含以下信息。

Map<PoseLandmarkType, PoseLandmark> landmarks // Map object representing the list of PoseLandmark

每个 PoseLandmark 包含以下数据。

PoseLandmarkType type // the type of detected landmark
Offset position // the x, y position of detected landmark
double inFrameLikelihood // the probability of the detected landmark to be inside the frame

以下是 PoseLandmarkType 值的列表。

LEFT_EYE
LEFT_EYE_INNER
LEFT_EYE_OUTER
RIGHT_EYE
RIGHT_EYE_INNER
RIGHT_EYE_OUTER
LEFT_EAR
RIGHT_EAR
NOSE
LEFT_MOUTH
RIGHT_MOUTH
LEFT_SHOULDER
RIGHT_SHOULDER
LEFT_ELBOW
RIGHT_ELBOW
LEFT_WRIST
RIGHT_WRIST
LEFT_THUMB
RIGHT_THUMB
LEFT_INDEX
RIGHT_INDEX
LEFT_PINKY
RIGHT_PINKY
LEFT_HIP
RIGHT_HIP
LEFT_KNEE
RIGHT_KNEE
LEFT_ANKLE
RIGHT_ANKLE
LEFT_HEEL
RIGHT_HEEL
LEFT_FOOT_INDEX
RIGHT_FOOT_INDEX

姿态绘制

为了方便从 Pose 对象绘制到屏幕,我们提供了 PoseOverlay,您可以将其传递给 InputCameraViewoverlay 参数。有关如何使用此绘制的更多详细信息,请参阅此处的实际示例代码

PoseOverlay(
  size: size,
  originalSize: originalSize,
  rotation: rotation,
  pose: pose,
)

处置

detector.dispose();

示例项目

您可以从示例项目 此处了解更多信息。

GitHub

查看 Github