使用 CameraX 时,前置摄像头的 Facebase MLKit 人脸检测失败

Posted

技术标签:

【中文标题】使用 CameraX 时,前置摄像头的 Facebase MLKit 人脸检测失败【英文标题】:Facebase MLKit face detection failed with front camera when using CameraX 【发布时间】:2020-02-15 16:19:01 【问题描述】:

我正在尝试使用Firebase MLKitCameraX 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,它与前置摄像头配合良好。

【问题讨论】:

【参考方案1】:

通过将lensfacingImageAnalysis 设置为CameraX.LensFacing.FRONT 来解决它:

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

【讨论】:

以上是关于使用 CameraX 时,前置摄像头的 Facebase MLKit 人脸检测失败的主要内容,如果未能解决你的问题,请参考以下文章

使用CameraX几行代码实现摄像头预览和拍照

Android CameraX实现摄像头预览拍照录制视频

Android CameraX 图像旋转

Android 使用CameraX实现预览/拍照/录制视频/图片分析/对焦/缩放/切换摄像头等操作

Android CameraX 仿一甜相机(录像拍照可调节尺寸聚焦照明网格线),最全的CameraX教程

使用 CameraX 使用长焦镜头进行变焦