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
Detector
s 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 coordenadasPreviewView
transformadas.COORDINATE_SYSTEM_ORIGINAL
: as coordenadas originais do streamImageAnalysis
.
Um
Executor
que 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_REFERENCED
que 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).