Lectura de imágenes RGB con un ImageReader
Estoy tratando de usar un ImageReader
para obtener imágenes RGB de la cámara. Estoy utilizando la API de Camera2 desde Android 5.0 "L" en un Nexus 5 que ejecuta la vista previa del desarrollador.
Ya tengo un SurfaceView
configurado para imágenes RGB que está funcionando bien y sé que el hardware de la cámara produce datos RGB (porque todos los ajustes de mapeado de tono y color en Android se especifican para operar en canales RGB).
- Ejemplo de error de cámara al bloquear / desbloquear el dispositivo
- Manejo adecuado de la rotación de la cámara (en TextureView)
- Tome y guarde la imagen presionando el botón
- Samsung Galaxy Camera Android API - aplicaciones de cámara personalizadas
- ¿Cómo ver las fotos tomadas en Android sin utilizar la base de datos?
Puedo obtener YUV_420_888 imágenes de ImageReader creando el ImageReader de esta manera:
imageReader = ImageReader.newInstance(W, H, ImageFormat.YUV_420_888, 4);
Y luego convertir las imágenes YUV a RGB. Sin embargo, esto es introducir un error de cuantificación no deseado (ya que mi aplicación requiere imágenes RGB), y el tiempo de procesamiento innecesario.
Sin embargo, cuando intento crear el lector de imágenes de esta manera:
imageReader = ImageReader.newInstance(W, H, PixelFormat.RGB_888, 4);
La captura de imagen falla con la siguiente excepción:
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 <my code...>
Estoy confundido en dos frentes. En primer lugar, el formato de salida mencionado, 0x22, no está en PixelFormat o ImageFormat. Parece ser algún tipo de modo sin documentar crudo, pero no puedo usar ImageReader.newInstance(W, H, 0x22, 4)
para capturarlo (obtengo java.lang.UnsupportedOperationException: Invalid format specified 34
). Me encantaría capturar en formato raw pero no puedo convencer a ImageFormat para aceptarlo (y el otro formato raw ImageFormat.RAW_SENSOR
es increíblemente lento por alguna razón).
En segundo lugar, el SurfaceView
ya está consumiendo RGB_888
imágenes RGB_888
(por lo que puedo decir), y ponerlas directamente en la pantalla. Entonces, ¿por qué ImageReader
no acepta correctamente las imágenes RGB? ¿Qué hice mal?
- Servidor de la cámara Android muerto y error de la cámara - 100
- Cómo restringir el complemento para cambiar la cámara trasera / trasera en android / cordova
- Guardar bitmap en tarjeta SD sin comprimirla en android
- Espejo de la cámara frente a frente en Android
- Cámara abierta de Android del botón
- La calidad de la imagen es mala usando cámara personalizada
- Uso de SurfaceTexture en combinación con RenderScript
- Cómo indentify dedo está en la lente de la cámara o no en android?
- ¿Cómo utilizar ExecutorService con Android AsyncTask?
- Usando onTouch y onCreateContextMenu al mismo tiempo