2016-08-18 4 views
2

Ich möchte Gesichtserkennung/Tracking auf einer Videodatei (z. B. ein MP4 aus der Benutzergalerie) mit der Android Vision FaceDetector API durchführen. Ich kann viele Beispiele zur Verwendung der CameraSource-Klasse sehen, um Gesichtstracking in dem direkt von der Kamera kommenden Stream auszuführen (z. B. on the android-vision github), aber nichts in Videodateien.Android Gesichtserkennung API - Gespeicherte Videodatei

Ich habe versucht, den Quellcode für durch Android Studio, aber es ist verschleiert, und ich konnte das Original online nicht sehen. Ich stelle fest, dass es viele Gemeinsamkeiten zwischen der Verwendung der Kamera und der Verwendung einer Datei gibt. Vermutlich spiele ich einfach die Videodatei auf einem Surface und übergebe das dann an eine Pipeline.

Alternativ kann ich sehen, dass Frame.Builder Funktionen setImageData und setTimestampMillis hat. Wenn ich das Video als ByteBuffer einlesen könnte, wie würde ich das an die FaceDetector API übergeben? Ich denke, this question ist ähnlich, aber keine Antworten. In ähnlicher Weise dekodieren Sie das Video in Bitmap Frames und übergeben Sie das an setBitmap.

Idealerweise möchte ich das Video nicht auf dem Bildschirm wiedergeben, und die Verarbeitung sollte so schnell erfolgen, wie die FaceDetector-API in der Lage ist.

+0

Es ist eine Open-Source-Version von CameraSource hier: https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/ Kamera/CameraSource.java – pm0733464

+0

Haben Sie Ihr Problem gelöst, bin ich gleich konfrontiert? –

Antwort

2

Alternativ kann ich sehen, dass Frame.Builder die Funktionen setImageData und setTimestampMillis hat. Wenn ich das Video als ByteBuffer einlesen könnte, wie würde ich das an die FaceDetector API weitergeben?

Rufen Sie einfach an SparseArray<Face> faces = detector.detect(frame); wo detector wie diese erstellt werden muss:

FaceDetector detector = new FaceDetector.Builder(context) 
    .setProminentFaceOnly(true) 
    .build(); 
+0

Vielen Dank, wissen Sie, wie Sie eine Videodatei und generieren Sie die richtige Art von ByteBuffer für die FaceDetector API oder können Sie mich auf einen Link verweisen ? Die SO-Frage, die ich erwähnte (33173525), hatte Probleme beim Konvertieren ihrer Daten in das richtige Pufferformat (ImageFormat.YV12) und hat keine Lösung Nachricht veröffentlicht. –

+0

MediaCodec API ist die "offizielle" Art, solche Dinge jetzt zu tun. Es ist jedoch zu kompliziert. Vielleicht haben Sie mehr Erfolg mit ffmpeg-Bibliotheken, aber ich würde lieber MediaCodec verwenden. –

1

Wenn die Verarbeitungszeit ist nicht ein Problem, mit MediaMetadataRetriever.getFrameAtTime die Frage löst. Als Anton vorgeschlagen, können Sie auch FaceDetector.detect verwenden:

Bitmap bitmap; 
Frame frame; 
SparseArray<Face> faces; 
MediaMetadataRetriever mMMR = new MediaMetadataRetriever(); 
mMMR.setDataSource(videoPath); 
String timeMs = mMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); // video time in ms 
int totalVideoTime= 1000*Integer.valueOf(timeMs); // total video time, in uS 
for (int time_us=1;time_us<totalVideoTime;time_us+=deltaT){ 
     bitmap = mMMR.getFrameAtTime(time_us, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); // extract a bitmap element from the closest key frame from the specified time_us 
     if (bitmap==null) break; 
     frame = new Frame.Builder().setBitmap(bitmap).build(); // generates a "Frame" object, which can be fed to a face detector 
     faces = detector.detect(frame); // detect the faces (detector is a FaceDetector) 
     // TODO ... do something with "faces" 
    } 

wo deltaT=1000000/fps und fps die gewünschte Anzahl von Bildern pro Sekunde ist. Zum Beispiel, wenn Sie 4 Frames pro Sekunde extrahieren möchten, deltaT=250000 (Beachten Sie, dass faces wird bei jeder Iteration überschrieben werden, so dass Sie etwas (store/Bericht Ergebnisse) innerhalb der Schleife tun sollten

+0

Was ist Ihre For-Schleife tut, freundlicherweise ausgearbeitet –

+0

aktualisiert, fügte hinzu – pwoolvett

+0

Die Gesichter, die wir bekommen sind die Gesicht erkannt Frames oder was es eigentlich ist ?? und wie man mit ihnen umgehen kann, kann ich es in Bitmap konvertieren oder kann ich es in Datei speichern! –