analyse method
Future<CustomFace?>
analyse(
- CameraImage image,
- CameraDescription cameraDescription
)
override
Implementation
@override
Future<CustomFace?> analyse(
CameraImage image,
CameraDescription cameraDescription,
) async {
if (!isSupported) return null;
final String method = _usesBgra ? 'analyzeBgra' : 'analyzeNv21';
final Map<String, Object?>? payload = _usesBgra
? _bgraPayload(image)
: _nv21Payload(image);
if (payload == null) return null;
try {
final Object? result = await methodChannel.invokeMethod<Object?>(method, {
...payload,
'rotation': cameraDescription.sensorOrientation,
'isFrontCamera':
cameraDescription.lensDirection == CameraLensDirection.front,
});
if (result is Map) {
final map = Map<String, dynamic>.from(result);
final int faceCount = (map['faceCount'] as num?)?.toInt() ?? 0;
if (faceCount <= 0) return null;
final double imageWidth = image.width.toDouble();
final double imageHeight = image.height.toDouble();
final bool swapsAxes = Platform.isIOS ||
cameraDescription.sensorOrientation == 90 ||
cameraDescription.sensorOrientation == 270;
final double rotatedWidth = swapsAxes ? imageHeight : imageWidth;
final double rotatedHeight = swapsAxes ? imageWidth : imageHeight;
Rect boundingBox;
if (map.containsKey('boundingBoxLeft')) {
boundingBox = Rect.fromLTRB(
(map['boundingBoxLeft'] as num).toDouble(),
(map['boundingBoxTop'] as num).toDouble(),
(map['boundingBoxRight'] as num).toDouble(),
(map['boundingBoxBottom'] as num).toDouble(),
);
} else {
final double left = (map['faceLeft'] as num?)?.toDouble() ?? 0.0;
final double top = (map['faceTop'] as num?)?.toDouble() ?? 0.0;
final double right = (map['faceRight'] as num?)?.toDouble() ?? 1.0;
final double bottom = (map['faceBottom'] as num?)?.toDouble() ?? 1.0;
boundingBox = Rect.fromLTRB(
left * rotatedWidth,
top * rotatedHeight,
right * rotatedWidth,
bottom * rotatedHeight,
);
}
return CustomFace(
trackingId: (map['trackingId'] as num?)?.toInt() ?? 1,
smilingProbability: (map['smileProb'] as num?)?.toDouble(),
mouthOpenProbability: (map['mouthOpenProb'] as num?)?.toDouble(),
headEulerAngleX: (map['pitch'] as num?)?.toDouble() ?? 0.0,
headEulerAngleY: (map['yaw'] as num?)?.toDouble() ?? 0.0,
headEulerAngleZ: (map['roll'] as num?)?.toDouble() ?? 0.0,
leftEyeOpenProbability: (map['leftEyeOpen'] as num?)?.toDouble(),
rightEyeOpenProbability: (map['rightEyeOpen'] as num?)?.toDouble(),
boundingBox: boundingBox,
luminance: (map['luminance'] as num?)?.toDouble(),
);
}
return null;
} on PlatformException {
return null;
}
}