Android MLKit 中的 ImageAnalyzer 和 VisionProcessor 之间的明显区别是什么(如果有)?

What is the distinct difference between an ImageAnalyzer and VisionProcessor in Android MLKit, if any?

我是 MLKit 新手。

我在查看文档和示例 MLKit 应用程序时注意到的第一件事是似乎有多种方法可以 attach/use 图像 processors/analyzers.

在某些情况下,他们演示了如何使用 ImageAnalyzer api https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android

private class YourImageAnalyzer : ImageAnalysis.Analyzer {

override fun analyze(imageProxy: ImageProxy) {
    val mediaImage = imageProxy.image
    if (mediaImage != null) {
        val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
        // Pass image to an ML Kit Vision API
        // ...
    }
}

}

似乎分析器可以绑定到 CameraProviders 的生命周期

cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture, imageAnalyzer)

在 MLKit 展示应用中显示的其他情况下,CameraSource 有一个可以设置的帧处理器。

cameraSource?.setFrameProcessor(
        if (PreferenceUtils.isMultipleObjectsMode(this)) {
            MultiObjectProcessor(graphicOverlay!!, workflowModel!!)
        } else {
            ProminentObjectProcessor(graphicOverlay!!, workflowModel!!)
        }
    )

那么,这仅仅是做同一件事的两种不同方法吗?它们可以混合搭配吗?选择一个而不是另一个有性能优势吗?

举个具体的例子:如果我想使用 MLKit ImageLabeler,我应该将它包装在处理器中并将其设置为 CameraSource 的 ImageProcessor,还是在图像分析回调中使用它并将其绑定到 CameraProvider?

最后,在使用 CameraSource 的示例中(MLKit Material 展示应用程序)没有使用 CameraProvider...这仅仅是因为 CameraSource 使它变得无关紧要且不需要了吗?在那种情况下,将 ImageAnalyzer 绑定到 CameraProvider 甚至不是一个选项吗?是否可以简单地根据需要为 CameraSource 设置不同的 ImageProcessor,因为它们 运行 通过不同的场景,例如 ImageLabelling、对象检测、文本识别等?

不同之处在于底层相机实现。分析器接口来自CameraX,而处理器需要开发者为camera1编写。

如果你想使用android.hardware.Camera,你需要按照示例创建一个处理器并将相机输出提供给MLKit。 如果你想使用cameraX,那么你可以按照vision sample app中的例子,找到CameraXLivePreviewActivity。