![](/img/trans.png)
[英]zzrb.zza resulting in a divide by zero arithmetic exception for every other cameraX analyzer.analyze frame
[英]CameraX analyzer does not run on every frame
我嘗試使用 Android 開發人員文檔使用 CameraX 實現 MLKit 文本分析器。 我的期望是分析器將在每一幀上運行,但它只運行一次,當預覽初始化時。 文本由 MLKit 分析,但只有在我旋轉屏幕並重新啟動片段時才會執行分析。 為什么會發生這種情況?
在 XML 我使用<androidx.camera.view.PreviewView.../>
。
在片段中:
private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider>
private fun startCamera() {
context?.let { ctx ->
cameraProviderFuture = ProcessCameraProvider.getInstance(ctx)
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(ctx))
}
}
private fun bindPreview(cameraProvider: ProcessCameraProvider) {
val preview: Preview = Preview.Builder()
.build()
val cameraSelector: CameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
val analyzer = ImageAnalysis.Builder()
.setTargetResolution(Size(1280, 720))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build().apply {
setAnalyzer(Executors.newSingleThreadExecutor(), TextAnalyzer())
}
val camera = cameraProvider.bindToLifecycle(viewLifecycleOwner, cameraSelector, analyzer, preview)
preview.setSurfaceProvider(preview_view.createSurfaceProvider(camera.cameraInfo))
}
分析器實現:
class TextAnalyzer : ImageAnalysis.Analyzer {
val detector = FirebaseVision.getInstance().onDeviceTextRecognizer
@SuppressLint("UnsafeExperimentalUsageError")
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image
val rotation = degreesToFirebaseRotation(imageProxy.imageInfo.rotationDegrees)
mediaImage?.let { image ->
val firebaseImage = FirebaseVisionImage.fromMediaImage(image, rotation)
detector.processImage(firebaseImage)
.addOnSuccessListener { firebaseVisionText ->
val text = firebaseVisionText.text
val textBlock = firebaseVisionText.textBlocks
Log.i("TEXT_ANALYZER", "success text $text")
textBlock.forEach {
Log.i("TEXT_ANALYZER", "success text BLOCK $it")
}
}
.addOnFailureListener { e ->
Log.i("TEXT_ANALYZER", "failed ex $e")
}
}
}
private fun degreesToFirebaseRotation(degrees: Int): Int = when (degrees) {
0 -> ROTATION_0
90 -> ROTATION_90
180 -> ROTATION_180
270 -> ROTATION_270
else -> throw Exception("Rotation must be 0, 90, 180, or 270.")
}
}
我已經找到答案了。 我只需要更仔細地閱讀文檔,它說必須關閉圖像代理才能不阻塞線程和預覽:-)
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image
val rotation = degreesToFirebaseRotation(imageProxy.imageInfo.rotationDegrees)
mediaImage?.let { image ->
val firebaseImage = FirebaseVisionImage.fromMediaImage(image, rotation)
detector.processImage(firebaseImage)
.addOnSuccessListener { firebaseVisionText ->
val text = firebaseVisionText.text
val textBlock = firebaseVisionText.textBlocks
// IMPORTANT
imageProxy.close()
}
.addOnFailureListener { e ->
// IMPORTANT
imageProxy.close()
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.