evaluate method

FaceGateResult evaluate({
  1. required FaceBoundingBox boundingBox,
  2. required int frameWidth,
  3. required int frameHeight,
  4. int rotation = 0,
})

Evaluates a boundingBox against camera frame dimensions (frameWidth, frameHeight).

Implementation

FaceGateResult evaluate({
  required FaceBoundingBox boundingBox,
  required int frameWidth,
  required int frameHeight,
  int rotation = 0,
}) {
  if (frameWidth <= 0 || frameHeight <= 0) {
    return const FaceGateResult(
      isValid: false,
      status: LivenessStatus.tooFar,
      faceAreaRatio: 0.0,
      aspectRatio: 1.0,
    );
  }

  final frameArea = (frameWidth * frameHeight).toDouble();
  final faceArea = (boundingBox.width * boundingBox.height).abs();
  final faceAreaRatio = (faceArea / frameArea).clamp(0.0, 1.0);

  final normRotation = ((rotation % 360) + 360) % 360;
  final isTransposed = normRotation == 90 || normRotation == 270;

  final uprightWidth = isTransposed ? boundingBox.height : boundingBox.width;
  final uprightHeight = isTransposed ? boundingBox.width : boundingBox.height;

  final safeHeight = uprightHeight > 0 ? uprightHeight : 1.0;
  final aspectRatio = uprightWidth / safeHeight;

  if (faceAreaRatio < minFaceAreaRatio) {
    return FaceGateResult(
      isValid: false,
      status: LivenessStatus.tooFar,
      faceAreaRatio: faceAreaRatio,
      aspectRatio: aspectRatio,
    );
  }

  if (faceAreaRatio > maxFaceAreaRatio) {
    return FaceGateResult(
      isValid: false,
      status: LivenessStatus.tooClose,
      faceAreaRatio: faceAreaRatio,
      aspectRatio: aspectRatio,
    );
  }

  if (aspectRatio < minAspectRatio || aspectRatio > maxAspectRatio) {
    return FaceGateResult(
      isValid: false,
      status: LivenessStatus.invalidAspectRatio,
      faceAreaRatio: faceAreaRatio,
      aspectRatio: aspectRatio,
    );
  }

  return FaceGateResult.valid(
    faceAreaRatio: faceAreaRatio,
    aspectRatio: aspectRatio,
  );
}