Google MLKit Face Detection适用于iPhone 6s,但不适用于iPhone X



我正在使用Google的MLKit在iOS上使用Swift进行人脸检测。我遵循了入门指南。指南中的代码适用于我的iPhone 6s,但它不适用于我的iPhone X。事实证明,这与imageOrientation函数有关。在我的捕获会话中,我调整图像的方向,使像素数据与预期的方向匹配(UIImage.Orientation.up(。我通过检查通过调试器输入到 MLKit 中的图像来验证这一点。正如预期的那样,我的 6s 上的 imageOrientation 函数返回 .up,但是对于我的 X,它返回 .leftMirrored。为了暂时解决此问题,我将visionImage.orientation硬设置为.up,但它仍然不适用于我的X。我还尝试了所有其他方向选项,但没有一个有效。

下面是我创建的类中的相关代码。对我可能做错了什么有什么建议吗?

public func detect(sampleBuffer: CMSampleBuffer, cameraPosition: AVCaptureDevice.Position, completion: @escaping (Face?) -> Void) {
let start = CACurrentMediaTime()
let visionImage = VisionImage(buffer: sampleBuffer)
visionImage.orientation = .up //imageOrientation(deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)

faceDetector.process(visionImage) { faces, error in
guard error == nil, let faces = faces, !faces.isEmpty else {
print("NO FACES FOUND")
completion(nil)
return
}

print(CACurrentMediaTime() - start)

let face = faces.first!
self.computeKeypoints(fromFace: face)

completion(face)
}
}
private func imageOrientation(deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position) -> UIImage.Orientation {
switch deviceOrientation {
case .portrait:
return cameraPosition == .front ? .leftMirrored : .right
case .landscapeLeft:
return cameraPosition == .front ? .downMirrored : .up
case .portraitUpsideDown:
return cameraPosition == .front ? .rightMirrored : .left
case .landscapeRight:
return cameraPosition == .front ? .upMirrored : .down
case .faceDown, .faceUp, .unknown:
return .up
@unknown default:
fatalError()
}
}

您需要根据使用的是前置摄像头还是后置摄像头来推导图像方向。 在此处查看快速入门示例应用的工作示例:

https://github.com/googlesamples/mlkit/blob/master/ios/quickstarts/vision/VisionExample/CameraViewController.swift#L888

这适用于iPhone X。