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

使用Android Camera2 API和Firebase ML Kit Vision进行实时条形码处理,android,kotlin,android-camera2,firebase-mlkit,Android,Kotlin,Android Camera2,Firebase Mlkit,在我的应用程序中,在试图使用ML Kit Vision库处理条形码时,呈现预览非常不稳定。我想这是因为我对背景音乐和Runnable缺乏了解 我已经按照Google/Firebase的一些快速入门指南安装了我的应用程序,Camera2预览效果很好 我还设置了onImageAvailableListener回调 /** * This a callback object for the [ImageReader]. "onImageAvailable" will be called when a

在我的应用程序中,在试图使用ML Kit Vision库处理条形码时,呈现预览非常不稳定。我想这是因为我对背景音乐和Runnable缺乏了解

我已经按照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发布到后台处理程序,并在条形码处理器中调用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(图像,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"
    }
}

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

我现在正在学习通过摄像头扫描条形码,github上的示例对我有所帮助。也许会对你有帮助


查看类
CameraSource

图像在
FirebaseVisionImage.fromMediaImage(图像,1)
中使用后应首先关闭,因此在该行之后写入
image.close()
,并删除
mediaImage.close()
@MortenHolmgaard立即调用close仍然会导致处理速度非常慢。因为我也玩了很多,最后跳过了使用ML Kit,因为我无法正确执行它。我最终降低了曲面的分辨率,一切都变得更快。OP询问使用Camera2 API的解决方案,您提供了使用Camera类的链接,但该类不提供问题。