分析图像

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

实现

图像处理方式是向 setAnalyzer() 方法传递一种包含 ImageProxy 参数和旋转参数的方法。

以下代码示例显示了如何执行此操作,以及如何将图像分析用例和预览用例绑定到 LifecycleOwner。要了解如何创建预览用例,请参阅实现预览

从此方法返回后,图片引用即会关闭。因此,此方法应完成分析或创建副本,而不是将图像引用传递到分析方法以外。

图像分析可以分为两种模式:阻止模式和非阻止模式。阻止模式通过 ImageAnalysis.ImageReaderMode.ACQUIRE_NEXT_IMAGE 设置。在此模式下,分析器会按顺序从相机接收帧;这意味着,如果 analyze 方法花费的时间超过单帧在当前帧速率下的延迟时间,则帧可能不再是最新的帧,因为新帧已被阻止进入流水线,直到该方法返回为止。

非阻止模式通过 ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE 设置。在此模式下,分析器会从相机接收调用 analyze 方法时的最后一个可用帧。如果此方法花费的时间超过单帧在当前帧速率下的延迟时间,可能会跳过某些帧,以便在下一次 analyze 接收数据时,它会获取相机流水线中的最后一个可用帧。您可以使用 ImageAnalysisConfig.Builder.setCallbackHandler 将 analyze 方法设置为在回调处理程序上运行,这样就可以在分析器功能运行的同时运行流水线的其余部分。如果您没有设置处理程序,则 analyze 方法将在主线程上运行。

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

其他资源

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

Codelab

  • CameraX 使用入门
  • 代码示例

  • 官方 CameraX 示例应用