Google 的 机器学习套件可提供设备端机器学习 Vision API,用于检测人脸、扫描条形码、为图片加标签等。借助机器学习套件分析器,您可以更轻松地将机器学习套件与 CameraX 应用集成。
机器学习套件分析器是 ImageAnalysis.Analyzer
接口的实现。该分析器会通过替换默认目标分辨率(如果需要)来针对机器学习套件的使用进行优化,处理坐标转换,并将框架传递给会返回汇总分析结果的机器学习套件。
实现机器学习套件分析器
如需实现机器学习套件分析器,建议使用 CameraController
类,该类可与 PreviewView
配合使用来显示界面元素。在使用 CameraController
进行实现时,机器学习套件分析器会为您处理原始 ImageAnalysis
流与 PreviewView
之间的坐标转换。该分析器会从 CameraX 接收目标坐标系,计算坐标转换,并将其转发给机器学习套件的 Detector
类进行分析。
若要将机器学习套件分析器与 CameraController
搭配使用,请调用 setImageAnalysisAnalyzer()
并向它传递一个新的机器学习套件分析器对象,同时在其构造函数中包含以下内容:
- 机器学习套件
Detector
的列表,CameraX 将按顺序依次调用。 用于确定机器学习套件输出坐标的目标坐标系:
COORDINATE_SYSTEM_VIEW_REFERENCED
:转换后的PreviewView
坐标。COORDINATE_SYSTEM_ORIGINAL
:原始的ImageAnalysis
流坐标。
用于调用 Consumer 回调并将
MlKitAnalyzer.Result
(即相机框架的汇总机器学习套件结果)传递给应用的Executor
。CameraX 在有新的机器学习套件输出内容时调用的
Consumer
。
以下代码会使用 CameraController
来实现机器学习套件分析器,以设置用于检测二维码的 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. });
在上面的代码示例中,机器学习套件分析器会将以下内容传递给 BarcodeScanner
的 Detector
类:
- 基于代表目标坐标系的
COORDINATE_SYSTEM_VIEW_REFERENCED
的转换 Matrix。 - 相机框架。
如果 BarcodeScanner
遇到任何问题,它的 Detector
会抛出错误,并且机器学习套件分析器会将该错误传播到您的应用。如果成功,机器学习套件分析器将返回 MLKitAnalyzer.Result#getValue()
,在本例中为 Barcode
对象。
您还可以使用 camera-core
中的 ImageAnalysis
类来实现机器学习套件分析器。不过,由于 ImageAnalysis
并未与 PreviewView
集成,因此您必须手动处理坐标转换。如需了解详情,请参阅机器学习套件分析器参考文档。
其他资源
如需获取具有机器学习套件分析器功能且能正常运行的相机应用,请参阅 CameraX-MLKit 示例。