Этот вопрос касается использования Google Mobile Vision Face API на Android.
История (фон) и что я хочу сделать
Я пытаюсь реализовать функцию, которая распознает лица на виде с камеры и накладывает изображения на эти лица.
Теперь я уже успешно реализовал такую функцию с помощью API-интерфейса Mobile Vision Распознавание лиц . Его механизм таков:
- CameraView (я использую
Фотоаппарат здесь), что
может передать каждый кадр камеры в обратном вызове
- Я превращаю этот кадр в
Bitmap
- Растровое изображение передается в Mobile Vision API для обнаружения лица
- При обнаружении лица я получаю его положение и размер
- Используя эту информацию о положении, нарисуйте что-нибудь в другом пользовательском представлении.
Проблема в том, вышеуказанный процесс, очевидно, занимает слишком много времени . Я могу обновлять положение наложенного изображения 3-5 раз в секунду, еще реже на медленных устройствах.
Если посмотреть на профилирование, то, как ни удивительно, самый тяжелый метод - это шаг 3 (Определение лица). В среднем требуется 100 мс, чтобы выполнить один раз.
Второй тяжелый метод - преобразование кадра NV21 в растровый объект, который занимает около 90 мс.
Подводя итоги, я получаю обновление FPS от 3 до 5.
Но кроме этого, все работает отлично - изображение может быть получено с высоким качеством , с автофокусом и масштабированием .
Как насчет слежения за лицом?
С другой стороны, API Mobile Vision предоставляет еще один API - Отслеживание лица .
В примере приложения Google отслеживание выполняется очень быстро, оно почти мгновенно следует за лицами в окне предварительного просмотра камеры. Как указано в документе, это происходит потому, что механизм совершенно другой - вместо обнаружения лиц в каждом кадре, после обнаружения лица, позиция просто следует за его движением, не выполняя никакого обнаружения лица.
Но на самом деле такой механизм достаточно хорош в моем случае использования!
Однако, глядя на пример кода, похоже, что мне нужно использовать его встроенную реализацию CameraSource
. Это можно найти в коде ниже:
mCameraSource = new CameraSource.Builder(context, detector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedFps(30.0f)
.build();
detector
является главным героем здесь, и он используется здесь только при переходе к CameraSource
. Похоже, я должен придерживаться этого CameraSource
.
Однако, хотя этот источник камеры имеет метод takePicture()
, я не могу найти способ реализовать автофокус и увеличение .
Наконец, вопрос
Моя конечная цель состоит в том, чтобы реализовать функцию, о которой я упоминал в начале, со следующими требованиями:
- Высокое качество изображения
- Автофокус
- Увеличить
- Быстрое положение лица
обновление (примерно 10 раз в секунду достаточно хорошо)
1-3 можно сделать с помощью функции распознавания лиц, но не 4;
Хотя 4 можно сделать с помощью Face Tracker, но не 1-3.
Есть ли способ выполнить все 1-4? Я приветствую любые предложения, даже если они используют другую библиотеку вместо Mobile Vision.
Спасибо, что дочитали до конца такой длинный вопрос!