6

我正在创建一个工具来使用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)
4

2 回答 2

15

我今天也遇到了同样的问题,所以,发现缺少一个参数,这是Executor我们需要传递的,否则会出现相同的编译错误。

正如AsyncTasks我过去使用的那样,我认识到要在 中的多个线程中执行任务AsyncTasks,我们需要使用其静态方法,该方法executeOnExecutor()以 anExecutor作为参数,因此我使用了相同的参数,即我用作方法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 代表你想在线程池中创建的线程数。它取决于你的用例。

告诉我它是否对你有用。

于 2019-10-16T13:11:19.823 回答
0

您还可以在 CameraX 官方示例应用程序中找到实现: CameraFragment.kt

您需要的部分是:

// Executor field
private lateinit var analysisExecutor: Executor

// in onCreate()
analysisExecutor = Executors.newSingleThreadExecutor()

// after initializing imageAnalysis
imageAnalysis.setAnalyzer(analysisExecutor, ImageAnalysis.Analyzer {
    // TODO analyze
})

如果您想知道是否使用或其他内容Executors.newSingleThreadExecutor()Executors.newFixedThreadPool(n)请查看Executors 文档

于 2020-02-27T14:35:19.503 回答