Ошибка компиляции при установке imageAnalysis.setAnalyzer () - PullRequest
2 голосов
/ 16 октября 2019

Я создаю инструмент для захвата каждого кадра из предварительного просмотра с помощью cameraX (для распознавания лиц)

Я обнаружил, что использование ImageAnalysis было способом.

Пока я не попытался использоватькод в соответствии с рекомендациями:

val imageAnalysisConfig = ImageAnalysisConfig.Builder()
            .setTargetResolution(Size(1280, 720))
            .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
            .build()
        val imageAnalysis = ImageAnalysis(imageAnalysisConfig)

        imageAnalysis.setAnalyzer({ image: ImageProxy, rotationDegrees: Int ->
            viewModel.onAnalyzeImage(image)
        })

На что я получаю следующую ошибку компиляции по методу setAnalyser:

None of the following function can be called with the arguments supplied
setAnalyser((command : Runnable!) -> Unit,  (image: ImageProxy!, rotationDegrees: Int) -> Unit)

1 Ответ

4 голосов
/ 16 октября 2019

Я также столкнулся с той же проблемой сегодня, поэтому обнаружил, что есть один отсутствующий параметр, который является Executor, который нам нужно передать, в противном случае возникает такая же ошибка компиляции.

Как и при работе с AsyncTasks в прошлом я осознавал, что для выполнения задач в нескольких потоках в AsyncTasks нам нужно использовать его статический метод executeOnExecutor(), который принимает Executor в качестве параметра, поэтому я использовал тот же параметр, т.е. я использовал AsyncTask.THREAD_POOL_EXECUTOR как первый параметр в методе setAnalyser(). И это работает как шарм! После ввода этого параметра в качестве первого параметра вам нужно внести некоторые незначительные изменения в свой предыдущий код.

Примерно так:

 imageAnalysis.setAnalyzer(AsyncTask.THREAD_POOL_EXECUTOR,
 object : ImageAnalysis.Analyzer {    // changes to be done in this line
                    override fun analyze(imageProxy: ImageProxy, rotationDegrees: Int) {
                        val image = FirebaseVisionImage.fromMediaImage(
                                imageProxy.image!!, getFirebaseRotation(rotationDegrees)
                        )

                        if (processingBarcode.get() ||
                                !lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
                            return
                        }
    ..................
    .............
    .......BLA BLA BLA
    }

Попробуйте и скажите мне, работает ли этот подход с вашим вариантом использования.

РЕДАКТИРОВАТЬ

Если вам не нравится AsyncTask, я нашел альтернативу для получения экземпляра Executor без использования AsyncTask.THREAD_POOL_EXECUTOR.

. Вы можете использоватьExecutors.newFixedThreadPool(n), чтобы получить Executor экземпляр. Здесь n обозначает количество потоков, которые вы хотите создать в пуле потоков. Это зависит от вашего варианта использования.

Скажите, сработало ли это для вас.

...