Обработка штрих-кода в реальном времени с помощью Android Camera2 API и Firebase ML-Kit Vision - PullRequest
1 голос
/ 15 октября 2019

В моем приложении предварительный просмотр при попытке обработки штрих-кодов с использованием библиотеки 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 и вызывайте image.close () в BarcodeProcessor.

/**
 * 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"
    }
}

. Любая помощь / советы / указания будут с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...