首页 > 解决方案 > 使用 Android Camera2 API 和 Firebase ML-Kit Vision 进行实时条码处理

问题描述

在我的应用程序中,在尝试使用 ML-Kit Vision 库处理条形码时渲染预览确实很不稳定。我认为这是由于我对背景主题和可运行文件缺乏了解。

我已经按照一些 Googles / Firebase 快速入门指南设置了我的应用程序,并且 Camera2 预览工作正常。

我还设置了一个 onImageAvailableListener 回调

/**
 * This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
 * preview frame is ready to be processed.
 */
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
    // Processing code here
}

这是我的第一次尝试。使用 mediaImage 发布到后台处理程序并在 BarcodeProcessor 中调用 image.close()。

/**
 * This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
 * preview frame is ready to be processed.
 */
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {

    val mediaImage = it.acquireNextImage()
    backgroundHandler?.post(BarcodeProcessor(mediaImage, barcodeDetector))
}

internal class BarcodeProcessor(
    private val image: Image,
    private val barcodeDetector: FirebaseVisionBarcodeDetector
) : Runnable {

    override fun run() {
        Log.d(TAG, "run")
        try {
            val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)
            // ... more processing
        } catch (e: IOException) {
            Log.e(TAG, e.toString())
        } finally {
            image.close()
        }
    }

    companion object {
        /**
         * Tag for the [Log].
         */
        private val TAG = "BarcodeProcessor"
    }
}

问题是 onImageAvailableListener 在多个图像中发布到 backgroundHandler 没有及时关闭它们。这val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)真的很慢,这是问题的一部分。

第二次尝试

backgroundHandler在这里,我尝试在调用后立即关闭图像。这种方法的问题是图像已经在backgroundHandler

/**
 * This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
 * preview frame is ready to be processed.
 */
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {

    val mediaImage = it.acquireNextImage()
    backgroundHandler?.post(BarcodeProcessor(mediaImage, barcodeDetector))
    mediaImage.close()
}

internal class BarcodeProcessor(
    private val image: Image,
    private val barcodeDetector: FirebaseVisionBarcodeDetector
) : Runnable {

    override fun run() {
        Log.d(TAG, "run")
        try {
            val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)
            // ... more processing
        } catch (e: IOException) {
            Log.e(TAG, e.toString())
        } finally {

        }
    }

    companion object {
        /**
         * Tag for the [Log].
         */
        private val TAG = "BarcodeProcessor"
    }
}

任何帮助/提示/方向将不胜感激。

标签: androidkotlinandroid-camera2firebase-mlkit

解决方案



推荐阅读