Google 致力于为黑人社区推动种族平等。查看具体举措

分析图像

图像分析用例为您的应用提供了可供 CPU 访问以执行图像处理、计算机视觉或机器学习推断的图像。该应用会实现对每个帧运行的 analyze 方法。

实现

通过将执行图像分析的执行程序和 ImageAnalysis.Analyzer 参数传递到 setAnalyzer() 方法处理图像。

本主题中的代码示例展示了如何执行此操作,以及如何将图像分析用例和预览用例绑定到 LifecycleOwner。如需了解如何创建预览用例,请参阅实现预览

图像分析可以分为两种模式:阻塞模式和非阻塞模式。通过使用 STRATEGY_BLOCK_PRODUCER 调用 setBackpressureStrategy() 以启用阻塞模式。在此模式下,执行程序会按顺序从相机接收帧;这意味着,如果 analyze() 方法所用的时间超过单帧在当前帧速率下的延迟时间,帧便可能不再是最新的帧,因为新帧已被阻止进入流水线,直到该方法返回为止。

通过使用 STRATEGY_KEEP_ONLY_LATEST 调用 setBackpressureStrategy() 以启用非阻塞模式。在此模式下,执行程序会从相机接收调用 analyze() 方法时的最后一个可用帧。如果此方法所用的时间超过单帧在当前帧速率下的延迟时间,可能会跳过某些帧,以便在下一次 analyze() 接收数据时,它会获取相机流水线中的最后一个可用帧。

analyze() 返回前,请通过调用 image.close() 关闭图片引用,以避免阻塞其他图像的生成(导致预览停顿)并避免可能出现的图像丢失。此方法必须完成分析或创建副本,而不是将图像引用传递到分析方法以外。

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 会生成 YUV_420_888 格式的图片。

其他资源

要详细了解 CameraX,请参阅下面列出的其他资源。

Codelab

  • CameraX 使用入门
  • 代码示例

  • 官方 CameraX 示例应用