decodeHolisticLandmarkerResult function
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,
);
}