1

目が開いているかどうかを知るためにgetIsLeftEyeOpenProbabilityfromを使用しています。mobile vision 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
    }
 }

なぜこれが起こるのですか、どうすれば解決できますか?

4

1 に答える 1

3

「setClassificationType」を介して、目の開閉を分類するための検出器オプションがありません。faceDetector は次のように作成する必要があります。

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

この場合、「setLandmarkType」は「setClassificationType」の暗黙の依存関係であるため、省略できます。

また、このオプションを設定しても、ドキュメントに記載されている「UNCOMPUTED_PROBABILITY」値である -1 を取得することができます。

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
}
于 2016-04-01T13:59:02.727 に答える