analyse method

  1. @override
Future<CustomFace?> analyse(
  1. CameraImage image,
  2. 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;
  }
}