Я использую 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()
})
}
Мне было интересно, есть ли у кого-нибудь какие-либо идеи о том, как я могу сохранить данные фреймов у фреймов, у которых есть грани внутри, чтобы я мог продолжить их обработку.
Заранее спасибо.