这个系列文章我们来介绍一位海外工程师如何探索 CameraX 音视频相机技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 8 篇:CameraX MLKit 分析器。
—— 来自公众号关键帧Keyframe的分享
谷歌的 ML Kit 提供了设备端机器学习视觉 API,用于检测人脸、扫描二维码、标记图像等。ML Kit Analyzer 使将 ML Kit 与你的 CameraX 应用集成变得更容易。
ML Kit Analyzer 是 ImageAnalysis.Analyzer
接口的实现。它根据需要覆盖默认的目标分辨率以优化 ML Kit 使用,处理坐标变换,并将帧传递给 ML Kit,后者返回聚合的分析结果。
实现 ML Kit Analyzer
为了实现 ML Kit Analyzer,我们建议使用 CameraController
类,它与 PreviewView
配合显示 UI 元素。当使用 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
,CameraX 在有新的 ML Kit 输出时调用它。
以下代码使用 CameraController
实现 ML Kit Analyzer,设置 BarcodeScanner
以检测二维码:
// 创建 BarcodeScanner 对象
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? ->
// result.getResult(barcodeScanner) 的值可以直接用于绘制 UI 覆盖层。
}
)
// 创建 BarcodeScanner 对象
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 -> {
// result.getResult(barcodeScanner) 的值可以直接用于绘制 UI 覆盖层。
});
在上述代码示例中,ML Kit Analyzer 将以下内容传递给 BarcodeScanner
的 Detector
类:
- 基于
COORDINATE_SYSTEM_VIEW_REFERENCED
的变换矩阵,它表示目标坐标系。 - 相机帧。
如果 BarcodeScanner
遇到任何问题,其 Detector
将抛出错误,ML Kit Analyzer 将其传播到你的应用。如果成功,ML Kit Analyzer 返回 MLKitAnalyzer.Result#getValue()
,在这种情况下是 Barcode
对象。
还可以使用 camera-core
中的 ImageAnalysis
类来实现 ML Kit Analyzer。但是,由于 ImageAnalysis
未与 PreviewView
集成,因此你必须手动处理坐标变换。有关更多信息,请参阅 ML Kit Analyzer 参考文档。
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/58072.html