parse static method

ScanResult parse(
  1. String rawInput, {
  2. Rect? faceBoundingBox,
  3. Map<String, dynamic>? extraMetadata,
})

Parses raw text description, metadata, or JSON string of detected facial metrics.

Implementation

static ScanResult parse(
  String rawInput, {
  Rect? faceBoundingBox,
  Map<String, dynamic>? extraMetadata,
}) {
  final metadata = Map<String, dynamic>.from(extraMetadata ?? {});

  final headEulerAngleY = (metadata['headEulerAngleY'] as num?)?.toDouble() ?? 0.0;
  final headEulerAngleZ = (metadata['headEulerAngleZ'] as num?)?.toDouble() ?? 0.0;
  final headEulerAngleX = (metadata['headEulerAngleX'] as num?)?.toDouble() ?? 0.0;
  final smilingProb = (metadata['smilingProbability'] as num?)?.toDouble() ?? 0.85;
  final leftEyeOpenProb = (metadata['leftEyeOpenProbability'] as num?)?.toDouble() ?? 0.95;
  final rightEyeOpenProb = (metadata['rightEyeOpenProbability'] as num?)?.toDouble() ?? 0.95;

  final isFrontal = headEulerAngleY.abs() < 15.0 && headEulerAngleZ.abs() < 15.0;
  final isEyesOpen = leftEyeOpenProb > 0.5 && rightEyeOpenProb > 0.5;
  final faceQuality = (isFrontal ? 0.5 : 0.2) + (isEyesOpen ? 0.3 : 0.1) + (smilingProb * 0.2);

  final fields = <String, String>{
    'Detector Mode': 'ML Kit Vision Face AI Engine',
    'Face Detection Status': 'Single Face Profile Tracked ✓',
    'Frontal Pose': isFrontal ? 'Centered (Frontal View) ✓' : 'Angled Pose (${headEulerAngleY.toStringAsFixed(1)}°)',
    'Eyes Open State': isEyesOpen ? 'Both Eyes Open ✓' : 'Eyes Blinked / Closed ✗',
    'Smiling Probability': '${(smilingProb * 100).toStringAsFixed(1)}%',
    'Left Eye Open': '${(leftEyeOpenProb * 100).toStringAsFixed(1)}%',
    'Right Eye Open': '${(rightEyeOpenProb * 100).toStringAsFixed(1)}%',
    'Head Yaw Angle (Y)': '${headEulerAngleY.toStringAsFixed(1)}°',
    'Head Roll Angle (Z)': '${headEulerAngleZ.toStringAsFixed(1)}°',
    'Face Quality Index': '${(faceQuality * 100).toStringAsFixed(1)}%',
  };

  final verifications = {
    'faceDetected': true,
    'isFrontalPose': isFrontal,
    'areEyesOpen': isEyesOpen,
    'qualityThresholdMet': faceQuality >= 0.70,
  };

  final bbox = faceBoundingBox ?? const Rect.fromLTWH(120, 100, 240, 280);

  return ScanResult(
    mode: ScanMode.face,
    rawValue: rawInput.isNotEmpty ? rawInput : 'Face Detected [Quality: ${(faceQuality * 100).toStringAsFixed(1)}%]',
    isValid: faceQuality >= 0.60,
    confidence: (faceQuality).clamp(0.70, 0.99),
    format: 'ML_KIT_FACE_DETECTOR',
    boundingBox: bbox,
    fields: fields,
    verifications: verifications,
    metadata: {
      'documentType': 'faceDetection',
      'headYaw': headEulerAngleY,
      'headRoll': headEulerAngleZ,
      'headPitch': headEulerAngleX,
      'smilingProbability': smilingProb,
      'leftEyeOpenProbability': leftEyeOpenProb,
      'rightEyeOpenProbability': rightEyeOpenProb,
      'faceQualityScore': faceQuality,
    },
  );
}