Flutter Google-Ml-Kit-plugin中FaceDetector在iPhone相机场景下无法正常检测人脸的问题
解决iPhone相机照片ML Kit人脸检测返回空列表的问题
这个问题我之前在iOS开发时也碰到过,核心原因是iPhone相机拍摄的照片带有EXIF旋转信息,但默认的InputImage.fromFilePath没有正确解析这个方向,导致ML Kit实际上在检测一张旋转后的图片(比如人脸可能是倒置或侧转的),自然就检测不到人脸了。而图库选择的图片,image_picker通常已经自动处理了旋转,所以检测正常。
下面是具体的解决步骤:
1. 正确获取并设置图片的方向信息
使用image_picker返回的XFile的metadata来获取照片的EXIF方向,然后创建InputImage时明确指定这个方向:
final XFile? image = await picker.pickImage( source: ImageSource.camera, maxWidth: 300, maxHeight: 300, preferredCameraDevice: CameraDevice.front, ); if (image != null) { // 获取图片元数据,包含EXIF方向信息 final imageMetadata = await image.getMetadata(); final FaceDetector faceDetector = FaceDetector( options: FaceDetectorOptions( enableTracking: false, // 单张照片检测不需要开启tracking,建议关闭 enableContours: true, enableClassification: true, enableLandmarks: true, performanceMode: FaceDetectorMode.accurate )); // 创建带有正确方向信息的InputImage final inputImage = InputImage.fromFilePath( image.path, inputImageData: InputImageData( size: Size( image.width.toDouble(), image.height.toDouble() ), // 根据EXIF方向设置InputImage的旋转角度 imageRotation: InputImageRotationValue.fromRawValue( imageMetadata.exifOrientation! ) ?? InputImageRotation.rotation0deg, inputImageFormat: InputImageFormat.jpeg, ), ); final List faces = await faceDetector.processImage(inputImage); print(faces.length); // 现在应该能正常返回人脸数量了 }
2. 额外注意事项
- 关闭enableTracking:如果你是检测单张照片,
enableTracking: true完全没必要,这个参数是针对视频流中的人脸追踪设计的,单张检测开启可能会影响性能或干扰结果。 - 更新image_picker插件:确保你使用的是最新版本的image_picker,旧版本在iOS上获取EXIF metadata可能存在bug。
- 验证方向问题:可以把相机拍摄的照片保存到图库,再用
ImageSource.gallery选择检测,如果能正常识别,就确认是方向解析问题导致的。
为什么图库的图片能正常检测?
当你从图库选择图片时,image_picker会自动根据EXIF信息调整图片的实际显示方向,传入ML Kit的图片已经是正确朝向的,自然能检测到人脸。而相机拍摄的原始图片没有经过这个调整,ML Kit默认按原始像素方向检测,就会出现检测失败的情况。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

