1

我在带有 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()
        }
    }
4

1 回答 1

0

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

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

这适用于 iPhone X。

于 2021-01-20T17:59:41.483 回答