我在带有 Swift 的 iOS 上使用 Google 的 MLKit 进行人脸检测。我已按照入门指南进行操作。指南中的代码在我的 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()
}
}