2016-08-18 3 views
2

Я хотел бы выполнить обнаружение/отслеживание лица в видеофайле (например, MP4 из галереи пользователей) с использованием API Android Vision FaceDetector. Я могу увидеть множество примеров использования класса CameraSource для отслеживания лица в потоке, поступающем непосредственно с камеры (например, on the android-vision github), но ничего не отображается в видеофайлах.Android Face Detection API - Сохраненный видеофайл

Я пробовал смотреть исходный код для CameraSource через Android Studio, но он запутан, и я не мог видеть оригинальную онлайн. Я вижу, что между использованием камеры и использованием файла существует много общего. Предположительно, я просто воспроизвожу видеофайл на Surface, а затем передаю его в конвейер.

В качестве альтернативы, я вижу, что Frame.Builder имеет функции setImageData и setTimestampMillis. Если бы я смог прочитать в видео как ByteBuffer, как бы передать это API FaceDetector? Думаю, this question похож, но ответов нет. Аналогичным образом декодируйте видео в Bitmap кадрах и передайте это значение setBitmap.

В идеале я не хочу отображать видео на экране, и обработка должна происходить так же быстро, как и API FaceDetector.

+0

Там в версию с открытым исходным кодом CameraSource здесь: https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/ камера/CameraSource.java – pm0733464

+0

Помогла ли вам эта проблема? –

ответ

2

В качестве альтернативы, я вижу, что Frame.Builder имеет функции setImageData и setTimestampMillis. Если бы я смог прочитать в видео как ByteBuffer, как бы передать это API FaceDetector?

SparseArray<Face> faces = detector.detect(frame); Просто позвоните где detector должен быть создан так:

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

Спасибо. Вы знаете, как взять видеофайл и создать правильный тип ByteBuffer для API FaceDetector? Или вы можете указать мне ссылку «Вопрос SO, о котором я говорил (33173525), имел проблемы с преобразованием их данных в правильный формат буфера (ImageFormat.YV12) и не имеет солю . –

+0

MediaCodec API - это «официальный» способ делать такие вещи сейчас. Это слишком сложно. Возможно, у вас будет больше успеха с библиотеками ffmpeg, но я предпочел бы использовать MediaCodec. –

1

Если время обработки не является проблемой, с помощью MediaMetadataRetriever.getFrameAtTime решает вопрос. Как предположил Антон, вы можете также использовать FaceDetector.detect:

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

где deltaT=1000000/fps и fps является желаемым количеством кадров в секунду. Например, если вы хотите извлечь 4 кадра каждый второй, deltaT=250000 (Обратите внимание, что faces будут переписаны на каждой итерации, так что вы должны сделать что-то (результаты магазин/отчет) внутри цикла

+0

Что вы делаете в цикле? Делайте, ласково разрабатывайте –

+0

обновлено, добавлено описание – pwoolvett

+0

Лица, которые мы получаем, это лица, обнаруженные фреймами или на самом деле? и как с ними бороться, я могу преобразовать его в растровое изображение или сохранить его в файл! –