1

Ich verwende getIsLeftEyeOpenProbability von mobile vision API um zu wissen, ob das Auge offen ist oder nicht. Allerdings passiert etwas seltsames, ich bekomme immer die Wahrscheinlichkeit -1 auch wenn das Auge geöffnet ist. HiergetIsLeftEyeOpenProbability von Mobile Vision API gibt einen Wert von -1

ist der Code:

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 
    } 
} 

Warum dies geschieht, und wie kann ich sie lösen?

Antwort

2

Ihnen fehlt die Detektoroption zur Klassifizierung von Augen offen/geschlossen über "setClassificationType". Der faceDetector sollte wie folgt erstellt werden:

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

Sie könnten „setLandmarkType“ in diesem Fall verzichtet werden, da es eine implizite Abhängigkeit für „setClassificationType“ ist.

auch selbst mit dieser Option festgelegt, dann ist es möglich, -1 zu erhalten, die der „UNCOMPUTED_PROBABILITY“ Wert in der Dokumentation erwähnt ist:

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

UNCOMPUTED_PROBABILITY Kommen sie zurück in der Regel bedeutet, dass das Auge nicht erkannt, so dass nicht festgestellt werden kann, ob das Auge offen oder geschlossen ist. Also ich denke du willst das stattdessen:

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

Vielen Dank für diese großartige Erklärung. Aber diese Zeile boolean isLeftOpen = thisFace.getIsLeftEyeOpenProbability(); gibt mir Fehler, weil float nicht in boolean umgewandelt werden kann, können Sie bitte klären, was Sie mit dieser Zeile meinen? Oder meintest du, dass isLeftOpen float ist? – Dania

+1

Das war ein Tippfehler. Ich habe es repariert. – pm0733464

+0

Danke, es hat sehr gut funktioniert. – Dania