Обработка изображений в реальном времени Android camera2 api

Я очень плохо знаком с Android. Я пытаюсь использовать новый Android Camera2 API для создания приложения для обработки изображений в реальном времени. Мое приложение требует поддержания хорошей скорости FPS. Следуя некоторым примерам, мне удалось выполнить обработку изображения внутри метода onImageAvailable(ImageReader reader), доступного в классе ImageReader. Тем не менее, я могу получить частоту кадров около 5-7 кадров в секунду.

Я видел, что рекомендуется использовать RenderScript для обработки YUV с API Android camera2. Принесет ли использование RenderScript более высокую частоту кадров в секунду? Если так, пожалуйста, кто-нибудь может подсказать мне, как это реализовать, так как я новичок в Android, мне трудно понять концепции Allocation и RenderScript. Заранее спасибо.

2 ответа

Я не знаю, какой тип обработки изображения вы хотите выполнить. Но в случае, если вас интересует только интенсивность изображения (то есть информация о градациях серого), вам не нужно преобразовывать массив данных YUV (например, в формат JPEG). Для изображения, состоящего из n пикселей, информация об интенсивности задается первыми n байтами массива данных YUV. Итак, просто вырежьте эти байты из массива данных YUV:

 byte[] intensity = new byte[width*height];
 intensity = Arrays.copyOfRange(data, 0, width*height);

Теоретически, вы можете получить доступные диапазоны fps с помощью этого вызова:

characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

и установите желаемый диапазон fps здесь:

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);

Таким образом, в принципе, вы должны выбрать диапазон с одинаковой нижней и верхней границей, и это должно поддерживать постоянную частоту кадров.

ОДНАКО на устройствах с профилем LEGACY ни одно из протестированных мною устройств не смогло достичь 30 кадров в секунду при 1080p (S5, Z3 Compact, Huawei Mate S и HTC One M9). Единственный способ добиться этого - использовать устройство (LG G4), которое оказалось ПОЛНЫМ профилем.

Renderscript здесь ничего не купит, если вы собираетесь использовать его внутри onImageAvailable Перезвоните. Похоже, что получение изображения в этот момент является узким местом на устройствах LEGACY, поскольку новый API camera2 просто оборачивает старую и, по-видимому, создает столько накладных расходов, что обратный вызов больше не происходит при 30 кадрах в секунду. Поэтому, если Renderscript должен работать, вам нужно будет создать Surface и найти другой способ извлечь из него кадры.

Но здесь есть кикер... если вы вернётесь к устаревшему API, я почти гарантирую 30fps при любом разрешении, которое вы хотите. По крайней мере, это то, что я нашел на всех устройствах, которые я тестировал....

Другие вопросы по тегам