Я пытаюсь использовать 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 правильно? Что я сделал не так?