Остановка кадра при использовании функции распознавания лиц ML Kit - PullRequest
0 голосов
/ 14 марта 2019

Я использую ML Kit для обнаружения лиц в потоке предварительного просмотра камеры телефона, используя эту библиотеку CameraView . По сути, я скопировал код из здесь , чтобы обнаружить живые лица, используя поток предварительного просмотра, а затем обрезать их и наложить их поверх CameraView. Все работало, как и ожидалось, поэтому я попытался выполнить дополнительную обработку кадров, в которых были лица (например, использовать API для распознавания лиц или обрезать лицо и сохранить его локально на телефоне). Однако CameraView использует один объект Frame и непрерывно записывает поверх его данных байтового изображения. Это означает, что, если лицо в потоке камеры не будет совершенно неподвижным, к тому времени, когда ML Kit обнаружит лицо, и я попытаюсь обработать этот кадр / лицо, объект кадра изменил свои данные изображения. Следовательно, я обычно получаю рамку без лица или рамку с лицом в нижней половине, причем верхняя половина принадлежит следующему кадру.

Я пытался использовать метод frame.freeze (), однако это вызвало слишком большое использование памяти, и мое приложение каждый раз зависало, даже когда я использовал большую кучу. Ниже приведен код моей обработки лямбда, которая работает в фоновом режиме и вызывается CameraView каждый раз, когда доступен новый кадр.

cameraView.addFrameProcessor((frame ->
  {
     frame = frame.freeze();
     faceDetector.process(new Frame(frame.getData(),
             frame.getRotation(),
             new Size(frame.getSize().getWidth(), frame.getSize().getHeight()),
             frame.getFormat(),
             cameraView.getFacing() == Facing.BACK));
  }));

faceDetector - это объект FaceDetector, отвечающий за передачу данных кадра в ML Kit для его обработки. Хотя я вызываю frame.release () сразу после того, как ML Kit завершил обработку фрейма, я все равно получаю исключения OOM. Ниже приведена часть функции faceDetector.process ().

frame.data.let {
        firebaseFaceDetectorWrapper.process(
                image = convertFrameToImage(frame),
                onSuccess = {
                    if (it.isNotEmpty())
                        SaveCroppedPhotoTask(it, frame).execute()
                    faceBoundsOverlay.updateFaces(convertToListOfFaceBounds(it))
                    frame.frame.release()
                },
                onError = {
                    frame.frame.release()
                    Toast.makeText(faceBoundsOverlay.context, "Error processing images: $it", Toast.LENGTH_LONG).show()
                })
    }

Мне было интересно, есть ли у кого-нибудь какие-либо идеи о том, как я могу сохранить данные фреймов у фреймов, у которых есть грани внутри, чтобы я мог продолжить их обработку.

Заранее спасибо.

...