Подтвердить что ты не робот

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

Я пытаюсь использовать ImageReader для получения изображений RGB с камеры. Я использую Camera2 API от Android 5.0 "L" на Nexus 5, запускающем предварительный просмотр разработчика.

У меня уже есть 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 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 <my code...>

Я запутался на двух фронтах. Во-первых, упомянутый выходной формат 0x22 не находится ни в PixelFormat, ни в ImageFormat. Кажется, это какой-то недокументированный режим raw, но я не могу использовать ImageReader.newInstance(W, H, 0x22, 4) для его захвата (я получаю java.lang.UnsupportedOperationException: Invalid format specified 34). Я хотел бы захватить в необработанном формате, но я не могу убедить ImageFormat принять его (и другой необработанный формат ImageFormat.RAW_SENSOR по какой-то причине невероятно медленный).

Во-вторых, SurfaceView уже с удовольствием потребляет RGB_888 изображения (насколько я могу судить) и помещая их прямо на экран. Так почему же не ImageReader не принимать изображения RGB правильно? Что я сделал не так?

4b9b3361