首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FaceDetector.release()没有发布FaceDetector

FaceDetector.release()没有发布FaceDetector
EN

Stack Overflow用户
提问于 2020-10-06 01:13:10
回答 1查看 203关注 0票数 1

我正在使用ML人脸检测器:https://developers.google.com/ml-kit/vision/face-detection/android#kotlin_2

然后我从Camera2上获取一张图像并进行处理。但是我经常遇到这样的错误:"FaceDetector不是用FaceDetector.release()发布的“

更多详细信息:

代码语言:javascript
复制
W/FaceDetector: FaceDetector was not released with FaceDetector.release()
E/BufferQueueProducer: [ImageReader-960x1280f23m2-7166-0](id:1bfe00000000,api:4,p:386,c:7166) dequeueBuffer: BufferQueue has been abandoned

我遵循本教程的目的是为了获得camera2:https://medium.com/@tylerwalker/integrating-camera2-api-on-android-feat-kotlin-4a4e65dc593f

下面是我尝试为ML编写的代码:

代码语言:javascript
复制
val realTimeOps = FaceDetectorOptions.Builder()
.setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
.build()
val detector = FaceDetection.getClient(realTimeOps)
imageReader.setOnImageAvailableListener({
    imageReader.acquireLatestImage()?.let { image ->
    val mlImage = InputImage.fromMediaImage(image, 0) // TODO change image for calculation


    val result = detector.process(mlImage)
        .addOnSuccessListener {faces ->
            Log.d("photo", "Face found!")
        }
        .addOnFailureListener { e ->
            Log.d("photo", "Error: $e")
        }

        image.close()
    }
}, Handler { true })

而且,我的“检测器”val没有函数释放:'(

我希望有人能在这方面帮助我:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 01:20:27

我终于弄明白了这个错误是怎么发生的!

检测器必须只有一个实例。错误出在我代码的另一部分(我是安卓新手,也是第一次使用camera2):

代码语言:javascript
复制
 cameraCharacteristics[CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP]?.let { streamConfigurationMap ->
                streamConfigurationMap.getOutputSizes(ImageFormat.YUV_420_888)
                    ?.let { yuvSizes ->
                        val previewSize = yuvSizes.last()
                        val displayRotation = windowManager.defaultDisplay.rotation
                        val swappedDimensions = areDimensionsSwapped(displayRotation, cameraCharacteristics)
                        val rotatedPreviewWidth = if (swappedDimensions) previewSize.height else previewSize.width
                        val rotatedPreviewHeight = if (swappedDimensions) previewSize.width else previewSize.height
                        surfaceView.holder.setFixedSize(rotatedPreviewWidth, rotatedPreviewHeight)

                        
                        val imageReader = ImageReader.newInstance(rotatedPreviewWidth, rotatedPreviewHeight,
                            ImageFormat.YUV_420_888, 2)

                        val realTimeOps = FaceDetectorOptions.Builder()
                            .setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
                            .build()
                        val detector: FaceDetector = FaceDetection.getClient(realTimeOps)
                        imageReader.setOnImageAvailableListener({
                            imageReader.acquireLatestImage()?.let { image ->

                                val mlImage = InputImage.fromMediaImage(image, getRotationCompensation(cameraDevice.id, getInstance(), true))


                                val result = detector.process(mlImage)
                                    .addOnSuccessListener {faces ->
                                        if (faces.size > 0)
                                            Log.d("photo", "Face found!")
                                        else
                                            Log.d("photo", "No face have been found")
                                    }
                                    .addOnFailureListener { e ->
                                        Log.d("photo", "Error: $e")
                                    }
                                    .addOnCompleteListener {
                                        image.close()
                                    }
                            }
                        }, Handler { true })


                        val previewSurface = surfaceView.holder.surface
                        val recordingSurface = imageReader.surface

                        val captureCallback = object : CameraCaptureSession.StateCallback() {
                            override fun onConfigureFailed(session: CameraCaptureSession) {

                            }

                            override fun onConfigured(session: CameraCaptureSession) {

                                val previewRequestBuilder = cameraDevice.createCaptureRequest(
                                    TEMPLATE_PREVIEW
                                ).apply {
                                    addTarget(previewSurface)
                                    addTarget(recordingSurface)
                                }

                                session.setRepeatingRequest(
                                    previewRequestBuilder.build(),
                                    object: CameraCaptureSession.CaptureCallback() {},
                                    Handler { true }
                                )
                            }
                        }

                        cameraDevice.createCaptureSession(mutableListOf(previewSurface, recordingSurface), captureCallback, Handler {true})
                    }

我将FaceDetector的创建放在cameraCharacteristics中,但每次捕获图像时都会调用此函数。我需要将FaceDector的创建放在这个实例之外(所以很明显,因为他只想要一个实例,所以谷歌对我大喊大叫)。

现在,我在CameraDevice.StateCallback()的侦听器"onOpened“开始时得到了它。

我认为最好的做法是将检测器设置为null,作为类的私有属性,然后将其加载到onOpened()的侦听器中,并在onDisconnected()的侦听器中关闭它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64213266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档