我正在创建一个工具,可以使用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)
Divya Gupta.. 6
我今天也面临着同样的问题,因此,发现有一个缺少的参数Executor
需要我们传递,否则会出现相同的编译错误。
正如AsyncTasks
我过去的工作一样,我认识到要在中的多个线程中执行任务AsyncTasks
,我们需要使用其静态方法executeOnExecutor()
(将an 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代表您要在线程池中创建的线程数,具体取决于您的用例。
告诉我它是否对您有用。
我今天也面临着同样的问题,因此,发现有一个缺少的参数Executor
需要我们传递,否则会出现相同的编译错误。
正如AsyncTasks
我过去的工作一样,我认识到要在中的多个线程中执行任务AsyncTasks
,我们需要使用其静态方法executeOnExecutor()
(将an 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代表您要在线程池中创建的线程数,具体取决于您的用例。
告诉我它是否对您有用。