首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CameraX |开启/关闭图片分析

CameraX |开启/关闭图片分析
EN

Stack Overflow用户
提问于 2020-02-20 22:47:41
回答 3查看 1.8K关注 0票数 1

我正在尝试使用CameraX和ZXing条形码扫描库实现条形码扫描器。

我已经写了一个自定义的分析器,它解码条形码,这些条形码应该被处理(处理逻辑显然需要一些时间)。

因此,我想要的是禁用动态图像分析,如果处理操作的结果不成功,则再次启用它。

我的基本设置逻辑:

代码语言:javascript
复制
    private fun setupCamera() {
        processCameraProvider.unbindAll()
        val camera = processCameraProvider.bindToLifecycle(
            this,
            CameraSelector.DEFAULT_BACK_CAMERA,
            buildPreviewUseCase(),
            buildImageAnalysisUseCase())
    }

    private fun buildPreviewUseCase(): Preview {
        return Preview.Builder()
            .setTargetRotation(cameraPreview.display.rotation)
            .build()
            .apply {
                previewSurfaceProvider = cameraPreview.previewSurfaceProvider
            }
    }

    private fun buildImageAnalysisUseCase(): ImageAnalysis {
        return ImageAnalysis.Builder()
            .setTargetRotation(cameraPreview.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .build()
            .apply {
                setAnalyzer(Executors.newSingleThreadExecutor(),
                    ZxingBarcodeAnalyzer { qrResult ->
                        Handler(Looper.getMainLooper()).post {
                            viewModel.handleBarcode(qrResult.text)
                        }
                    })
            }
    }

在翻遍了所有的库源代码之后,我仍然不明白如何才能达到预期的效果?

如果我在processCameraProvider上调用unbind(imageAnalysisUseCase object),我就不能再次绑定该对象(processCameraProvider只有bindToLifecycle()方法,没有bind(imageAnalysisUseCase object))。

尽管再次调用setAnalyzer(),但在ImageAnalysis上调用clearAnalyzer()会完全重置图像分析。

EN

回答 3

Stack Overflow用户

发布于 2020-03-06 04:21:09

clearAnalyzer()出现问题

我像这样使用,直到修复:

代码语言:javascript
复制
  fun enableAnalysis(enable: Boolean) {
    if (!enable) {
        isAnalyzerSet = false
        imageAnalysisUseCase?.clearAnalyzer()
        imageAnalysisUseCase.setAnalyzer(analysisExecutor, ImageAnalysis.Analyzer { })

    } else {
        if (isAnalyzerSet) return
        isAnalyzerSet = true
        imageAnalysisUseCase?.setAnalyzer(analysisExecutor, analyzer)
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-03-08 16:04:19

如果您只想在处理图像时不处理任何图像,则可以在分析方法中设置一个标记,如果正在处理图像,该标记将立即返回。如下所示:

代码语言:javascript
复制
class MyViewModel: ViewModel() {

    private var isProcessing = false

    fun handleBarcode(text: String) {
        if (isProcessing) {
            return
        }
        // Do your processing here.
    }
}

如果调用processCameraProvider.unbind(imageAnalysis),则可以通过使用相同的实例调用processCameraProvider.bindToLifecycle(, , imageAnalysis)来再次绑定用例,但我不确定这是否有效。重新绑定相同的预览用例实例不起作用,我不确定该规则是否适用于ImageAnalysis。

票数 0
EN

Stack Overflow用户

发布于 2021-06-21 17:55:25

您可以要求生产者一次生成一个图像,直到您关闭代理为止。

代码语言:javascript
复制
ImageAnalysis imageAnalysis = imageAnalysisBuilder.setBackpressureStrategy(ImageAnalysis.STRATEGY_BLOCK_PRODUCER).setImageQueueDepth(1).build();

在文档中,https://developer.android.com/reference/androidx/camera/core/ImageAnalysis#STRATEGY_BLOCK_PRODUCER

阻止制作人生成新图像。

一旦生产者产生了与图像队列深度相等的图像数量,并且没有一个图像被关闭,那么生产者将停止产生图像。请注意,图像可能会在内部排队,直到使用ImageProxy.close()关闭最后一个发送的图像后才会发送到分析器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60322550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档