1

Я использую getIsLeftEyeOpenProbability от mobile vision API, чтобы узнать, открыт ли глаз или нет. Однако, что-то странное случается, я всегда получаю вероятность как -1, даже если глаз открыт.getIsLeftEyeOpenProbability от API мобильного зрения дает значение -1

Вот код:

FaceDetector faceDetector = new FaceDetector.Builder(getApplicationContext()) 
              .setTrackingEnabled(false) 
              .setLandmarkType(FaceDetector.ALL_LANDMARKS) 
              .build(); 

Frame frame = new Frame.Builder().setBitmap(obtainedBitmap).build(); 
SparseArray <Face> facesForLandmarks = faceDetector.detect(frame); 
faceDetector.release(); 
Thread homeSwipeThread; 

for (int a = 0; a < facesForLandmarks.size(); a++) { 
    Face thisFace = facesForLandmarks.valueAt(a); 
    List <Landmark> landmarks = thisFace.getLandmarks(); 

    for (int b = 0; b < landmarks.size(); b++) { 
     if (landmarks.get(b).getType() == landmarks.get(b).LEFT_EYE) { 
      leftEye = new Point(landmarks.get(b).getPosition().x, landmarks.get(b).getPosition().y - 3); 
     } else if (landmarks.get(b).getType() == landmarks.get(b).RIGHT_EYE) { 
      rightEye = new Point(landmarks.get(b).getPosition().x, landmarks.get(b).getPosition().y - 3); 
     } //end else if. 
    } //end inner 
    //for every detected face check eyes probability: 

    if (thisFace.getIsLeftEyeOpenProbability() <= 0.1) { 
     //some code 
    } 
} 

Почему это происходит, и как я могу решить эту проблему?

ответ

2

Вам не хватает опции детектора для классификации открытых/закрытых глаз с помощью «setClassificationType». FaceDetector должны быть созданы таким образом:

FaceDetector faceDetector = 
    new FaceDetector.Builder(getApplicationContext()) 
     .setTrackingEnabled(false) 
     .setLandmarkType(FaceDetector.ALL_LANDMARKS) 
     .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) 
     .build(); 

Вы можете опустить «setLandmarkType» в этом случае, так как это подразумевает зависимость для «setClassificationType».

Кроме того, даже с этой опцией набора, можно получить -1, который является «UNCOMPUTED_PROBABILITY» значение упоминается в документации:

https://developers.google.com/android/reference/com/google/android/gms/vision/face/Face.html#public-methods

Получение UNCOMPUTED_PROBABILITY обратно, как правило, означает, что глаз не было обнаружено, поэтому невозможно определить, открыт или закрыт глаз. Поэтому я думаю, что вы этого хотите:

float leftOpen = thisFace.getIsLeftEyeOpenProbability(); 
if ((leftOpen != Face.UNCOMPUTED_PROBABILITY) && (leftOpen <= 0.1)) { 
    //some code 
} 
+0

Благодарим вас за это замечательное объяснение. Но эта строка boolean isLeftOpen = thisFace.getIsLeftEyeOpenProbability(); дает мне ошибку, потому что float не может быть преобразован в boolean, можете ли вы прояснить, что вы подразумеваете под этой линией? Или, вы имели в виду, что isLeftOpen плавает? – Dania

+1

Это была опечатка. Я починил это. – pm0733464

+0

Спасибо, это сработало очень хорошо. – Dania

Смежные вопросы