decodeHolisticLandmarkerResult function

HolisticLandmarkerResult decodeHolisticLandmarkerResult(
  1. VisionResultData data
)

Decodes a Holistic Landmarker result. Google's browser API lists each part per subject; Holistic reports at most one.

Implementation

HolisticLandmarkerResult decodeHolisticLandmarkerResult(VisionResultData data) {
  final packed = <String, List<List<NormalizedLandmark>>>{};
  final packedWorld = <String, List<List<Landmark>>>{};
  if (data.landmarks case final buffer?) {
    var at = 0;
    for (final (name, counts) in data.parts ?? const <(String, List<int>)>[]) {
      final end = at + counts.fold(0, (a, b) => a + b) * packedLandmarkStride;
      final view = Float64List.sublistView(buffer, at, end);
      if (name.endsWith('WorldLandmarks')) {
        packedWorld[name] = unpackLandmarks(view, counts, Landmark.new);
      } else {
        packed[name] = unpackLandmarks(view, counts, NormalizedLandmark.new);
      }
      at = end;
    }
  }
  List<NormalizedLandmark> part(String name) {
    final subjects =
        packed[name] ??
        _jsonLandmarks(data.result[name], NormalizedLandmark.new);
    return subjects.isEmpty ? const [] : subjects.first;
  }

  List<Landmark> worldPart(String name) {
    final subjects =
        packedWorld[name] ?? _jsonLandmarks(data.result[name], Landmark.new);
    return subjects.isEmpty ? const [] : subjects.first;
  }

  final blendshapes = data.result['faceBlendshapes'] as List?;
  return HolisticLandmarkerResult(
    imageWidth: data.width,
    imageHeight: data.height,
    timestampMilliseconds: data.timestamp,
    faceLandmarks: part('faceLandmarks'),
    poseLandmarks: part('poseLandmarks'),
    poseWorldLandmarks: worldPart('poseWorldLandmarks'),
    leftHandLandmarks: part('leftHandLandmarks'),
    leftHandWorldLandmarks: worldPart('leftHandWorldLandmarks'),
    rightHandLandmarks: part('rightHandLandmarks'),
    rightHandWorldLandmarks: worldPart('rightHandWorldLandmarks'),
    faceBlendshapes: blendshapes == null || blendshapes.isEmpty
        ? null
        : _categories((blendshapes.first as Map)['categories']),
    poseSegmentationMask: _confidenceMasks(
      data.result['poseSegmentationMasks'],
    )?.firstOrNull,
  );
}