kotlin - Camerax Analyzer ImageProxy - 图像已关闭

标签 kotlin firebase-mlkit android-camerax

我正在使用 CameraX(测试版)并使用带有执行器的分析器来分析图像并在其上绘制边界/覆盖。根据文档,我需要关闭图像代理才能继续将图像放入分析功能中。当我添加 imageProxy.close() 调用时,它失败并出现“图像已关闭”错误。我在这里缺少什么? 分析器代码:

       private val successListener = OnSuccessListener<List<DetectedObject>> { papers ->
        isAnalyzing.set(false)

        val  rectPoints= mutableListOf<Rect>()
        Log.d(TAG," overlayRef Info: ${overlayRef.get()}")

        for (paper in papers) {
            val bounds = paper.boundingBox
            val paperId = paper.trackingId
            rectPoints+=bounds


            Log.d(TAG, "Successful Paper Analysis - Bounds of the paper: $bounds")
            Log.d(TAG," Labels found on the paper: ${paper.labels}")

        }
        Log.d(TAG, "Invoking pointsRectListener for : $rectPoints")
        pointsRectListener?.invoke(rectPoints)

    }
    private val failureListener = OnFailureListener { e ->
        isAnalyzing.set(false)
        Log.e(TAG, "Paper analysis failure.", e)
    }

    @SuppressLint("UnsafeExperimentalUsageError")
    override fun analyze(imageProxy: ImageProxy) {
        val mediaImage = imageProxy?.image ?: return
        Log.d(TAG,"entered analysis..analysis in progress?$isAnalyzing.get()")


        if (!isAnalyzing.get()){
            isAnalyzing.set(true)
            Log.d(TAG,"No other analysis in progress..so starting analysis now")
            val currentTimestamp = System.currentTimeMillis()
            if (currentTimestamp - lastAnalyzedTimestamp >= TimeUnit.SECONDS.toMillis(1)) {
                currentTimestamp - lastAnalyzedTimestamp
                    analysisSizeListener?.invoke(Size(imageProxy.width, imageProxy.height))

                    val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)

                    objectDetector.process(image)
                            .addOnSuccessListener(successListener)
                            .addOnFailureListener(failureListener)

            }

        }
        imageProxy.close()


    }

我实例化并绑定(bind)到生命周期的代码

        paperAnalyzer=ImageAnalysis.Builder()
                .setTargetAspectRatio(screenAspectRatio)
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .setTargetRotation(rotation)
                .build()
                .also {
                    it.setAnalyzer(cameraExecutor, PaperAnalyzer( WeakReference(overlayView)).apply {
                        pointsRectListener = { rectPoints ->
                            overlayView.rectPoints = rectPoints
                        }
                        analysisSizeListener = {
                            updateOverlayTransform(overlayView, it)
                        }
                    }


                      )

                }

        cameraProvider.unbindAll()

        try {
            camera = cameraProvider.bindToLifecycle(
                    this, cameraSelector, preview, imageCapture, paperAnalyzer)

            // Attach the viewfinder's surface provider to preview use case
            preview?.setSurfaceProvider(viewFinder.createSurfaceProvider())
        } catch (exc: Exception) {
            Log.e(TAG, "Use case binding failed", exc)
        }

最佳答案

您想要完成的逻辑似乎是这样的。

fun analyze(imageProxy) {
    if (isAnalyzing) {
        imageProxy.close() // 1
    } else {
        val image = imageInput.fromMediaImage(...)
        objectDetector.process(image)
                    .addOnSuccessListener(OnSuccessListener { result ->
                        // Do something with the result
                        imageProxy.close() // 2
                        isAnalyzing.set(false)
                    })
                    .addOnFailureListener(OnFailureListener { exception ->
                        // Do something with the exception
                        imageProxy.close() // 3
                        isAnalyzing.set(false)
                    })
    }
}

我可能是错的,但看起来您正在执行 1,而不是 2 和 3。您能否更新代码以遵循此模式,看看您是否仍然遇到该问题。

关于kotlin - Camerax Analyzer ImageProxy - 图像已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62312891/

相关文章:

function - 通用顶级功能引用

Android SDK 路线导航定制

android - 继承内部java类的问题

kotlin - Dagger2 - 如何使用 @Named 和 @BindsInstance

ionic3 - 是否可以将 Firebase ML kit api 与 ionic 一起使用?

swift - 如何在不丢失换行符的情况下翻译文本?

java - CameraX PreviewView 不显示任何内容

java - OpenCV + OpenGL : copy gl texture, 使用 OpenCV 修改并渲染

android - 如何为Google的MLKIT使用图像格式YUV_420_888

java - 如何在android中将透视变换应用于ImageProxy或Bitmap