O Kit de ML do Google fornece APIs Vision de aprendizado de máquina no dispositivo para detectar rostos, ler códigos de barras, rotular imagens e muito mais. O Analisador do Kit de ML facilita a integração do Kit de ML ao seu app do CameraX.
Ele é uma implementação da interface ImageAnalysis.Analyzer e substitui a resolução desejada padrão (se necessário) para otimizar o uso do Kit de ML, processa as transformações de coordenadas e transmite os frames ao Kit de ML, que retorna os resultados agregados de análise.
Implementar o Analisador do Kit de ML
Para implementar o Analisador do Kit de ML, recomendamos usar a classe CameraController, que funciona com PreviewView para mostrar elementos da interface. Quando implementado usando CameraController, o Analisador do Kit de ML
processa as transformações de coordenadas entre o stream ImageAnalysis
original e o PreviewView para você. Ele recebe o sistema de coordenadas de destino do
CameraX, calcula a transformação
das coordenadas e as encaminha para a classe Detector do Kit de ML para análise.
Para usar o Analisador do Kit de ML com CameraController, chame setImageAnalysisAnalyzer() e transmita
um novo objeto do Kit de ML com o seguinte no construtor:
- Uma lista de
Detectors do Kit de ML que o CameraX invoca sequencialmente em ordem. O sistema de coordenadas de destino que determina as coordenadas da saída do kit de ML:
COORDINATE_SYSTEM_VIEW_REFERENCED: as coordenadasPreviewViewtransformadas.COORDINATE_SYSTEM_ORIGINAL: as coordenadas originais do streamImageAnalysis.
Um
Executorque invoca o callback do consumidor e envia oMlKitAnalyzer.Result, ou o resultado do kit de ML agregado de um frame da câmera, para o app.Um
Consumer, que o CameraX invoca quando há uma nova saída do kit de ML.
O código abaixo implementa o Analisador do Kit de ML usando o CameraController para configurar
um BarcodeScanner para detectar códigos QR:
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. });
No exemplo de código acima, o Kit de ML analisa o seguinte para a classe
Detector de BarcodeScanner:
- A matriz
de transformação baseada em
COORDINATE_SYSTEM_VIEW_REFERENCEDque representa o sistema de coordenadas de destino. - Os frames da câmera.
Se o BarcodeScanner encontrar algum problema, o Detector gera um erro,
e o Kit de ML o propaga para o app. Se bem-sucedido, o Kit de ML retorna MLKitAnalyzer.Result#getValue(), que,
nesse caso, é o objeto Barcode.
Também é possível implementar o Analisador do Kit de ML usando a classe ImageAnalysis que faz parte de camera-core. No entanto, como ImageAnalysis
não está integrado com PreviewView,
é necessário processar manualmente as transformações de coordenadas. Para mais informações,
consulte a documentação de referência do Analisador do Kit de ML.
Outros recursos
Para um app de câmera funcional que usa o Analisador do Kit de ML, consulte o exemplo CameraX-MLKit (link em inglês).