使用Android Camera2 API和Firebase ML-Kit Vision进行实时条形码处理

问题描述 投票:1回答:1

在我的应用中,尝试使用ML-Kit Vision库处理条形码时呈现预览真的很不可靠。我认为这是由于我对背景剧和可运行物品缺乏了解。

我已经按照一些Google / 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"
    }
}

任何帮助/提示/指导将不胜感激。

android kotlin android-camera2 firebase-mlkit
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.