图片分析用例为您的应用提供可供 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
代码示例