2017-05-01 4 views
0

J'utilise l'API de vision mobile pour détecter le visage dans l'application Android.L'API de vision mobile prend trop de temps à détecter le visage

J'ai utilisé SparseArray of Face pour stocker les références aux faces, mais la méthode detector.detect (frame) prend trop de temps (15 secondes) pour détecter le visage.

Note: Je passe le bitmap de l'image prise par la caméra à la méthode detectFaces.

Mon code est ci-dessous

void detectFaces(Context context, Bitmap picture){ 
    com.google.android.gms.vision.face.FaceDetector detector = new com.google.android.gms.vision.face.FaceDetector.Builder(context) 
      .setTrackingEnabled(false) 
      .setClassificationType(com.google.android.gms.vision.face.FaceDetector.ALL_CLASSIFICATIONS) 
      .build(); 

    //Build the frame 
    Frame frame = new Frame.Builder().setBitmap(picture).build(); 

    //Detect the faces 
    SparseArray<Face> faces = detector.detect(frame);//**This takes approx 15 second** 
    if(faces.size() == 0) 
     Toast.makeText(context, "No Face Detected", Toast.LENGTH_SHORT).show(); 
    else 
    { 
     Toast.makeText(context,"Face detected are : " + faces.size() , Toast.LENGTH_LONG).show(); 
     getClassification(faces.valueAt(0)); 
    } 

    //Release the detector 
    detector.release(); 
} 

Répondre

0

Je vais actuellement grâce à cette application de l'échantillon et je suis tombé sur le même problème où l'application revient sans cesse non détecté le visage.

Après avoir lu la documentation trouvée here J'ai vu que je devrais utiliser detector.isOperational() pour tester si les fichiers requis ont été téléchargés pour que la détection fonctionne. J'ai utilisé cette méthode pour indiquer que les fichiers sont téléchargés comme ceci:

public static void detectFaces(Context context, Bitmap image){ 
     // Create the face detector, disable tracking and enable classifications 

     FaceDetector detector = new FaceDetector.Builder(context) 
       .setTrackingEnabled(false) 
       .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) 
       .build(); 

     if(detector.isOperational()){ 
      // Build the frame 
      Frame frame = new Frame.Builder().setBitmap(image).build(); 
      ... 
     }else{ 
      Toast.makeText(context, R.string.not_operational, Toast.LENGTH_LONG).show(); 
     } 


    } 

Ensuite, j'ai réalisé que le détecteur n'était jamais opérationnel. Après plus de recherches, j'ai trouvé que le problème était que mon appareil n'avait pas assez d'espace de stockage pour enregistrer les fichiers supplémentaires nécessaires. Je suis passé à un autre appareil a obtenu l'erreur «non opérationnel» sur le premier essai et il a fonctionné depuis lors. De plus, en libérant de l'espace et en déplaçant l'application vers un stockage externe, j'ai pu travailler sur mon premier appareil.