Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

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.

Cómo realizar la implementación

Las imágenes se procesan cuando se pasa un ejecutor en el que se ejecuta el análisis de imágenes y un parámetro ImageAnalysis.Analyzer al método setAnalyzer().

En el ejemplo de código de este tema, se muestra cómo hacerlo, además de 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.

El análisis de imágenes puede funcionar en dos modos: con bloqueo y sin bloqueo. El modo de bloqueo se habilita cuando se llama a setBackpressureStrategy() con STRATEGY_BLOCK_PRODUCER. En este modo, el ejecutor recibe fotogramas 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 en la velocidad de fotogramas actual, es posible que los marcos ya no estén vigentes, ya que se bloquea la entrada de los nuevos marcos a la canalización hasta que se muestra el método.

El modo sin bloqueo se habilita llamando a setBackpressureStrategy() con STRATEGY_KEEP_ONLY_LATEST. En este modo, el ejecutor recibe el último fotograma disponible de la cámara en el momento en que se llama al método analyze(). Si el método lleva más tiempo que la latencia de un solo fotograma a la velocidad de fotogramas actual, es posible que se omitan algunos fotogramas; de este modo, la próxima vez que analyze() reciba datos, obtendrá el último fotograma disponible en la canalización de la cámara.

Antes de regresar de analyze(), llama a image.close() para cerrar la referencia de imagen y evitar la producción de más imágenes (y el bloqueo de la vista previa), y evitar la posible caída de imágenes. El método debe completar el análisis o hacer una copia en lugar de pasar la referencia de la imagen más allá del método de análisis.

Kotlin

    val imageAnalysis = ImageAnalysis.Builder()
        .setTargetResolution(Size(1280, 720))
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .build()

    imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer { image ->
        val rotationDegrees = image.imageInfo.rotationDegrees
        // insert your code here.
    })

    cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageAnalysis, preview)
    

Java

    ImageAnalysis imageAnalysis =
        new ImageAnalysis.Builder()
            .setTargetResolution(new Size(1280, 720))
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .build();

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

    cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, 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
  • Muestra de código

  • App de muestra de CameraX oficial