processCameraImage method

Future<Face?> processCameraImage(
  1. InputImage inputImage, {
  2. required Size screenSize,
  3. required Size regionSize,
  4. int stabilityCount = 10,
  5. double eyeOpenProbability = 0.75,
  6. dynamic onFaceLiveStatusChange(
    1. FaceStatus
    )?,
})

stabilityCount Number of continuous steady shots required. eyeOpenProbability Probability of eyes being open.

Implementation

Future<Face?> processCameraImage(
  InputImage inputImage, {
  required Size screenSize,
  required Size regionSize,
  int stabilityCount = 10,
  double eyeOpenProbability = 0.75,
  Function(FaceStatus)? onFaceLiveStatusChange,
}) async {
  final List<Face> faces = await _faceDetector.processImage(inputImage);

  if (faces.isNotEmpty && faces.length == 1) {
    Face face = faces.first;

    /// Complete organ and part check.
    bool isLandmarks = _checkLandmarks(face);
    var isFaceRegionInside = _isFaceRegionInside(
        boundingBox: face.boundingBox,
        screenSize: screenSize,
        cameraSize: inputImage.metadata!.size,
        regionSize: regionSize);

    if (isLandmarks && isFaceRegionInside) {
      _tempFaces.add(face);
      if (_tempFaces.length > stabilityCount) {
        if ((face.leftEyeOpenProbability ?? 0.0) > eyeOpenProbability &&
            (face.rightEyeOpenProbability ?? 0.0) > eyeOpenProbability) {
          _faceDetector.close();
          _tempFaces.clear();
          onFaceLiveStatusChange?.call(FaceStatus.finish);
          return face;
        }
      }
      if (_tempFaces.isNotEmpty) {
        onFaceLiveStatusChange?.call(FaceStatus.inside);
      }
    }
  } else {
    _tempFaces.clear();
    onFaceLiveStatusChange?.call(FaceStatus.outside);
  }
  return null;
}