首页 > 解决方案 > 使用 CameraX 时,前置摄像头的 Facebase MLKit 人脸检测失败

问题描述

我正在尝试使用Firebase MLKitand来实现人脸检测CameraX ImageAnalysis。使用后置摄像头时效果很好,但是当我尝试使用前置摄像头时,它什么也没检测到:

val config = PreviewConfig.Builder()
        .setLensFacing(CameraX.LensFacing.FRONT)
        .build()
val previewUseCase = Preview(config)
previewUseCase.setOnPreviewOutputUpdateListener { previewOutput ->
    viewFinder.post {
        removeView(viewFinder)
        addView(viewFinder, 0)
        viewFinder.surfaceTexture = previewOutput.surfaceTexture
        updateTransform(previewOutput)
    }
}

val highAccuracyOpts = FirebaseVisionFaceDetectorOptions.Builder()
    .setPerformanceMode(FirebaseVisionFaceDetectorOptions.ACCURATE)
    .build()
val detector = FirebaseVision.getInstance().getVisionFaceDetector(highAccuracyOpts)
val imageAnalysisConfig = ImageAnalysisConfig.Builder()
    .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
    .build()
val imageAnalysis = ImageAnalysis(imageAnalysisConfig).apply {
    setAnalyzer(
        Executors.newSingleThreadExecutor(),
        ImageAnalysis.Analyzer { image, rotationDegrees ->
            if (image.image != null && isBusy.compareAndSet(false, true)) {
                val visionImage = FirebaseVisionImage.fromMediaImage(image.image!!, degreesToFirebaseRotation(rotationDegrees))
                detector.detectInImage(visionImage)
                    .addOnSuccessListener { faces ->
                        // faces.size always zero when using front camera
                        Timber.d("${faces.size}")
                        isBusy.set(false)
                    }
                    .addOnFailureListener { error ->
                        Timber.d("$error")
                    }
            }
        })
}

CameraX.bindToLifecycle(lifecycleOwner, previewUseCase, imageAnalysis)

我在带有 Android 10 的诺基亚 8.1 上进行了测试。我尝试了https://github.com/firebase/quickstart-android/tree/master/mlkit,它不使用CameraX并且与前置摄像头配合良好。

标签: androidfirebaseface-detectionfirebase-mlkitandroid-camerax

解决方案


通过设置lensfacingImageAnalysis解决它CameraX.LensFacing.FRONT

val imageAnalysisConfig = ImageAnalysisConfig.Builder()
    .setLensFacing(CameraX.LensFacing.FRONT)
    .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
    .build()

推荐阅读