Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Cómo analizar imágenes

El caso práctico de análisis de imágenes proporciona a tu app una imagen a la que se puede acceder desde la CPU para realizar procesamiento de imágenes, visión artificial o interferencia de aprendizaje automático. La aplicación implementa un método de análisis que se ejecuta en cada marco.

Implementación

Las imágenes se procesan pasando un método que toma un parámetro ImageProxy y un parámetro de rotación en el método setAnalyzer().

En el siguiente ejemplo de código, se muestra cómo hacerlo, y cómo vincular el caso práctico de análisis de imágenes y un caso práctico de vista previa a LifecycleOwner. Para leer sobre la creación de casos prácticos de vista previa, consulta Cómo implementar una vista previa.

Al volver del método, la referencia de imagen se cierra. Por lo tanto, el método debería completar el análisis o realizar una copia en lugar de pasar la referencia de imagen más allá del método de análisis.

El análisis de imágenes puede funcionar en dos modos: con bloqueo y sin bloqueo. El modo con bloqueo se establece mediante ImageAnalysis.ImageReaderMode.ACQUIRE_NEXT_IMAGE. En este modo, el analizador recibe marcos de la cámara en orden secuencial; esto significa que, si el método analyze tarda más que la latencia de un solo marco con la velocidad de marcos actual, es posible que los marcos no sean los actuales, ya que los nuevos marcos se bloquean y no pueden ingresar en la canalización hasta que se muestra el método.

El modo sin bloqueo se configura con ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE. En este modo, el analizador recibe el último marco disponible de la cámara cuando se llama al método analyze. Si el método lleva más tiempo que la latencia de un solo marco a la velocidad de marcos actual, es posible que se omitan algunos marcos; de este modo, la próxima vez que analyze reciba datos, obtendrá el último marco disponible en la canalización de la cámara. Puedes configurar el método de análisis para que se ejecute en un controlador de devolución de llamada mediante ImageAnalysisConfig.Builder.setCallbackHandler, que permite que el resto de la canalización se ejecute mientras se ejecuta la función del analizador. Si no estableces un controlador, el método de análisis se ejecutará en el subproceso principal.

Kotlin

    val imageAnalysisConfig = ImageAnalysisConfig.Builder()
        .setTargetResolution(Size(1280, 720))
        .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
        .build()
    val imageAnalysis = ImageAnalysis(imageAnalysisConfig)

    imageAnalysis.setAnalyzer({ image: ImageProxy, rotationDegrees: Int ->
        // insert your code here.
    })

    CameraX.bindToLifecycle(this as LifecycleOwner, imageAnalysis, preview)
    

Java

    ImageAnalysisConfig config =
        new ImageAnalysisConfig.Builder()
            .setTargetResolution(new Size(1280, 720))
            .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
            .build();

    ImageAnalysis imageAnalysis = new ImageAnalysis(config);

    imageAnalysis.setAnalyzer(
        new ImageAnalysis.Analyzer() {
            @Override
            public void analyze(ImageProxy image, int rotationDegrees) {
                // insert your code here.
            }
    });

    CameraX.bindToLifecycle((LifecycleOwner) this, imageAnalysis, preview);
    

CameraX produce imágenes en formato YUV_420_888.

Recursos adicionales

Para obtener más información acerca de CameraX, consulta los siguientes recursos adicionales.

Codelab

  • Cómo comenzar a usar CameraX
  • Ejemplo de código

  • App de muestra de CameraX oficial