Google 的 ML Kit 提供设备端机器学习 Vision API,用于人脸检测、条形码扫描、图像标记等。ML Kit Analyzer 让您可以更轻松地将 ML Kit 集成到您的 CameraX 应用中。
ML Kit Analyzer 是 ImageAnalysis.Analyzer
接口的一种实现。它会(如果需要)覆盖 默认目标分辨率 以优化 ML Kit 的使用,处理坐标转换,并将帧传递给 ML Kit,ML Kit 会返回聚合的分析结果。
实现 ML Kit Analyzer
要实现 ML Kit Analyzer,我们建议使用 CameraController
类,它与 PreviewView
协同工作以显示界面元素。使用 CameraController
实现时,ML Kit Analyzer 会为您处理原始 ImageAnalysis
流和 PreviewView
之间的坐标转换。它从 CameraX 接收目标坐标系,计算坐标转换,并将其转发到 ML Kit 的 Detector
类进行分析。
要将 ML Kit Analyzer 与 CameraController
搭配使用,请调用 setImageAnalysisAnalyzer()
并为其构造函数传入一个新的 ML Kit Analyzer 对象,其中包含以下内容:
- ML Kit
Detector
的列表,CameraX 会按顺序依次调用这些检测器。 确定 ML Kit 输出坐标的目标坐标系
COORDINATE_SYSTEM_VIEW_REFERENCED
:转换后的PreviewView
坐标。COORDINATE_SYSTEM_ORIGINAL
:原始ImageAnalysis
流坐标。
一个
Executor
,用于调用 Consumer 回调并将MlKitAnalyzer.Result
(即相机帧的聚合 ML Kit 结果)传递给应用。一个
Consumer
,当有新的 ML Kit 输出时,CameraX 会调用它。
以下代码使用 CameraController
实现 ML Kit Analyzer,以设置 BarcodeScanner
来检测二维码:
Kotlin
// create BarcodeScanner object val options = BarcodeScannerOptions.Builder() .setBarcodeFormats(Barcode.FORMAT_QR_CODE) .build() val barcodeScanner = BarcodeScanning.getClient(options) cameraController.setImageAnalysisAnalyzer( ContextCompat.getMainExecutor(this), MlKitAnalyzer( listOf(barcodeScanner), COORDINATE_SYSTEM_VIEW_REFERENCED, ContextCompat.getMainExecutor(this) ) { result: MlKitAnalyzer.Result? -> // The value of result.getResult(barcodeScanner) can be used directly for drawing UI overlay. } )
Java
// create BarcodeScanner object BarcodeScannerOptions options = new BarcodeScannerOptions.Builder() .setBarcodeFormats(Barcode.FORMAT_QR_CODE) .build(); BarcodeScanner barcodeScanner = BarcodeScanning.getClient(options); cameraController.setImageAnalysisAnalyzer(executor, new MlKitAnalyzer(List.of(barcodeScanner), COORDINATE_SYSTEM_VIEW_REFERENCED, executor, result -> { // The value of result.getResult(barcodeScanner) can be used directly for drawing UI overlay. });
在上面的代码示例中,ML Kit Analyzer 会将以下内容传递给 BarcodeScanner
的 Detector
类:
- 基于
COORDINATE_SYSTEM_VIEW_REFERENCED
的转换 Matrix,表示目标坐标系。 - 相机帧。
如果 BarcodeScanner
遇到任何问题,其 Detector
会抛出错误,ML Kit Analyzer 会将其传播到您的应用。如果成功,ML Kit Analyzer 会返回 MLKitAnalyzer.Result#getValue()
,在此示例中为 Barcode
对象。
您还可以使用 camera-core
中的 ImageAnalysis
类来实现 ML Kit Analyzer。但是,由于 ImageAnalysis
未与 PreviewView
集成,因此您必须手动处理坐标转换。如需了解详情,请参阅 ML Kit Analyzer 参考文档。
其他资源
如需查看具有 ML Kit Analyzer 功能的相机应用示例,请参阅 CameraX-MLKit 示例。