Используя Camera 2 API и Firebase, мы можем обнаружить лица в потоке предварительного просмотра с камеры. Следующий фрагмент является примером того, как мы можем определить размер предварительного просмотра, совместимый с камерой, с которой мы хотим работать:
Size[] cameraSupportedOutputSizes;
StreamConfigurationMap map = ch.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if(map != null) {
cameraSupportedOutputSizes = map.getOutputSizes(SurfaceTexture.class);
List<Size> sizes = Arrays.asList(cameraSupportedOutputSizes);
Log.e(TAG, Arrays.asList(cameraSupportedOutputSizes).toString());
}
Это даст следующий вывод (например):
[960x720, 864x480, 640x640, 800x480, 720x480, 768x432, 640x480, 480x640, 576x432, 640x360, 480x360, 480x320, 384x288, 352x288, 320x240, 240x320, 240x660, 160x660, 176x160, 176x160, 176x160, 176x160, 176x160, 176x160, 176x160, 176x160, 176x160, 176x160, 176x160, 176x160, 176x460 что, желая оптимизировать производительность, мы выбираем один из меньших размеров предварительного просмотра, например 800x480, и настраиваем мета-детектор лица Firebase следующим образом:
faceDetectorFrameMetadata = new FirebaseVisionImageMetadata.Builder()
.setRotation(correctRotation)
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
.setHeight(previewSize.getHeight())
.setWidth(previewSize.getWidth())
.build();
Теперь, когда мы открываем камеру и начинаем обнаруживать лица, мы обнаружит, что детектор лица "придирчив", когда дело доходит до размеров предварительного просмотра. Я могу с уверенностью сказать вам, что во многих случаях все, кроме самого большого размера предварительного просмотра и нескольких типичных размеров предварительного просмотра (таких как, но не ограничиваясь, 1280 x 720 на устройствах 16: 9 или 1024 x 768 на старых устройствах 4: 3 ) позволит правильно создать экземпляр детектора лиц, но не даст никаких лиц. Слушатель задачи обнаружения лиц вернет 0 найденных лиц.
Есть ли способ заранее определить, какие размеры предварительного просмотра подойдут для фантазии детектора Firebase?
Спасибо!