Чтение изображений RGB с помощью ImageReaderAndroid

Форум для тех, кто программирует под Android
Anonymous
Чтение изображений RGB с помощью ImageReader

Сообщение Anonymous »

Я пытаюсь использовать ImageReader для получения изображений RGB с камеры. Я использую API Camera2 из Android 5.0 «L» на Nexus 5 с предварительной версией для разработчиков. Обратите внимание, что я не спрашиваю, как преобразовать YUV в RGB — я пытаюсь получить RGB напрямую из ImageReader. Для тех, кто хочет знать, как конвертировать YUV в RGB, не стесняйтесь проконсультироваться с другим вопросом, например. Преобразуйте Android camera2 api YUV_420_888 в RGB.
У меня уже есть SurfaceView, настроенный для изображений RGB, который работает нормально, и я считаю, что аппаратное обеспечение камеры создает данные RGB (потому что все настройки отображения тонов и усиления цвета в Android указаны для работы с каналами RGB).
Я могу получить изображения YUV_420_888 из ImageReader, создав ImageReader следующим образом:

Код: Выделить всё

imageReader = ImageReader.newInstance(W, H, ImageFormat.YUV_420_888, 4);
а затем конвертируем изображения YUV в RGB. Однако это приводит как к нежелательной ошибке квантования (поскольку моему приложению требуются изображения RGB), так и к ненужному времени обработки.
Однако, когда я пытаюсь создать программу чтения изображений таким образом:

Код: Выделить всё

imageReader = ImageReader.newInstance(W, H, PixelFormat.RGB_888, 4);
захват изображения завершается неудачно, за следующим исключением:

Код: Выделить всё

java.lang.UnsupportedOperationException: The producer output buffer format 0x22 doesn't match the ImageReader's configured buffer format 0x3.
at android.media.ImageReader.nativeImageSetup(Native Method)
at android.media.ImageReader.acquireNextSurfaceImage(ImageReader.java:293)
at android.media.ImageReader.acquireNextImage(ImageReader.java:339)
at android.media.ImageReader.acquireLatestImage(ImageReader.java:243)
at 
Я запутался на двух фронтах. Во-первых, упомянутый выходной формат 0x22 отсутствует ни в PixelFormat, ни в ImageFormat. Кажется, это какой-то недокументированный необработанный режим, но я не могу использовать ImageReader.newInstance(W, H, 0x22, 4) для его захвата (я получаю java.lang.UnsupportedOperationException: указан неверный формат 34< /код>). Мне бы хотелось сделать снимок в необработанном формате, но я не могу убедить ImageFormat принять его (а другой необработанный формат ImageFormat.RAW_SENSOR по какой-то причине невероятно медленный).
Во-вторых, SurfaceView уже успешно принимает изображения RGB_888 (насколько я могу судить) и помещает их прямо на экран. Так почему же ImageReader не принимает изображения RGB должным образом? Что я сделал не так?


Подробнее здесь: https://stackoverflow.com/questions/257 ... magereader

Вернуться в «Android»