2016-06-03 2 views
6

J'ai la norme com.google.android.gms.vision.Tracker example en cours d'exécution avec succès sur mon appareil Android et maintenant je dois l'image pour post-traitement trouver l'iris du visage actuel qui a été notifié dans les méthodes d'événements de la Traqueur.Comment obtenir l'image actuelle (en tant que bitmap) pour android faceetector dans un événement Tracker?

Alors, comment puis-je obtenir le cadre Bitmap qui correspond exactement à la com.google.android.gms.vision.face.Face i reçu dans les événements Tracker? Cela signifie également que le bitmap final doit correspondre à la résolution de la webcam et non à la résolution de l'écran.

Une mauvaise solution consiste à appeler toutes les quelques takePicture ms sur mon CameraSource et traiter cette image séparément en utilisant le FaceDetector. Bien que cela fonctionne, j'ai le problème que le flux vidéo se bloque pendant takepicture et je reçois beaucoup de messages GC_FOR_ALLOC causant le gaspillage de la mémoire bêta faceetector unique.

+1

Qu'est-ce que vous cherchez semble être disponible à 'FaceDetector.SparseArray détecter (Frame var1)'. Une fois que vous avez une attente sur un objet Frame, vous avez getBitmap() qui semble très prometteur. Malheureusement, cette classe est finale, ce qui signifie que l'interception de Frame devrait être possible en utilisant la réflexion. – Fabio

+0

Je ne suis pas sûr d'avoir ce que vous suggérez. Ai-je raison, que vous supposez que j'ai un objet Frame à portée de main? Parce que c'est le problème auquel je suis confronté. J'ai un objet de visage détecté sans le cadre actuel et j'ai besoin du cadre correspondant à un objet de visage donné. Par exemple, le lien fourni dans ma question a une méthode onUpdate() en bas. Étant donné cette méthode, comment puis-je obtenir le cadre actuel correspondant à l'argument Face de la méthode? –

+0

Nous n'avons pas accès à un cadre, sauf si vous enveloppez toutes les méthodes dans FaceDetector et interceptez la méthode de détection (la réflexion n'aidera apparemment pas car elle est définitive). Sauvegardez le cadre et créez un getter, puis appelez le dans d'autres endroits au bon moment. – Fabio

Répondre

2

Vous devez créer votre propre version de suivi de visage qui prolongera google.vision détecteur de visage. Dans votre MainActivity ou FaceTrackerActivity (dans l'échantillon de suivi Google), élaborez votre version de classe FaceDetector comme suit:

class MyFaceDetector extends Detector<Face> { 
    private Detector<Face> mDelegate; 

    MyFaceDetector(Detector<Face> delegate) { 
     mDelegate = delegate; 
    } 

    public SparseArray<Face> detect(Frame frame) { 
     YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, frame.getMetadata().getWidth(), frame.getMetadata().getHeight(), null); 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     yuvImage.compressToJpeg(new Rect(0, 0, frame.getMetadata().getWidth(), frame.getMetadata().getHeight()), 100, byteArrayOutputStream); 
     byte[] jpegArray = byteArrayOutputStream.toByteArray(); 
     Bitmap TempBitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length); 

     //TempBitmap is a Bitmap version of a frame which is currently captured by your CameraSource in real-time 
     //So you can process this TempBitmap in your own purposes adding extra code here 

     return mDelegate.detect(frame); 
    } 

    public boolean isOperational() { 
     return mDelegate.isOperational(); 
    } 

    public boolean setFocus(int id) { 
     return mDelegate.setFocus(id); 
    } 
} 

Ensuite, vous devez joindre à votre propre FaceDetector avec CameraSource en modifiant votre méthode de CreateCameraSource comme suit:

private void createCameraSource() { 

    Context context = getApplicationContext(); 

    // You can use your own settings for your detector 
    FaceDetector detector = new FaceDetector.Builder(context) 
      .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) 
      .setProminentFaceOnly(true) 
      .build(); 

    // This is how you merge myFaceDetector and google.vision detector 
    MyFaceDetector myFaceDetector = new MyFaceDetector(detector); 

    // You can use your own processor 
    myFaceDetector.setProcessor(
      new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory()) 
        .build()); 

    if (!myFaceDetector.isOperational()) { 
     Log.w(TAG, "Face detector dependencies are not yet available."); 
    } 

    // You can use your own settings for CameraSource 
    mCameraSource = new CameraSource.Builder(context, myFaceDetector) 
      .setRequestedPreviewSize(640, 480) 
      .setFacing(CameraSource.CAMERA_FACING_FRONT) 
      .setRequestedFps(30.0f) 
      .build(); 
}