processNv21 method
FaceDetectionResult
processNv21(
- FaceMeshNv21Image image, {
- NormalizedRect? roi,
- int rotationDegrees = 0,
- bool mirrorHorizontal = false,
- double? roiScaleX,
- double? roiScaleY,
- double? roiShiftX,
- double? roiShiftY,
Processes an NV21 frame and returns normalized face detections.
Implementation
FaceDetectionResult processNv21(
FaceMeshNv21Image image, {
NormalizedRect? roi,
int rotationDegrees = 0,
bool mirrorHorizontal = false,
double? roiScaleX,
double? roiScaleY,
double? roiShiftX,
double? roiShiftY,
}) {
_ensureNotClosed();
_validateRotation(rotationDegrees);
final double resolvedRoiScaleX = roiScaleX ?? _defaultRoiScaleX;
final double resolvedRoiScaleY = roiScaleY ?? _defaultRoiScaleY;
final double resolvedRoiShiftX = roiShiftX ?? _defaultRoiShiftX;
final double resolvedRoiShiftY = roiShiftY ?? _defaultRoiShiftY;
final _NativeNv21Image nativeImage = _toNativeNv21Image(image);
final ffi.Pointer<MpNormalizedRect> roiPtr = roi != null
? _toNativeRect(roi)
: ffi.nullptr;
final ffi.Pointer<MpRoiTransformOptions> roiTransformPtr =
_toNativeRoiTransform(
resolvedRoiScaleX,
resolvedRoiScaleY,
resolvedRoiShiftX,
resolvedRoiShiftY,
);
FaceDetectionResult? processed;
try {
final ffi.Pointer<MpFaceDetectorResult> resultPtr = faceBindings
.mp_face_detector_process_nv21(
_context,
nativeImage.image,
roiPtr == ffi.nullptr ? ffi.nullptr : roiPtr,
rotationDegrees,
mirrorHorizontal ? 1 : 0,
roiTransformPtr,
);
if (resultPtr == ffi.nullptr) {
throw MediapipeFaceMeshException(
_readCString(faceBindings.mp_face_detector_last_error(_context)) ??
'Native face detector error.',
);
}
processed = _copyResult(resultPtr.ref);
faceBindings.mp_face_detector_release_result(resultPtr);
} finally {
pkg_ffi.calloc.free(nativeImage.yPlane);
pkg_ffi.calloc.free(nativeImage.vuPlane);
pkg_ffi.calloc.free(nativeImage.image);
if (roiPtr != ffi.nullptr) pkg_ffi.calloc.free(roiPtr);
if (roiTransformPtr != ffi.nullptr) pkg_ffi.calloc.free(roiTransformPtr);
}
return processed;
}