【问题标题】:IOS ML Kit face tracking does not work correctlyIOS ML Kit 人脸跟踪无法正常工作
【发布时间】:2021-01-25 15:21:24
【问题描述】:

人脸检测的tracking Id在人脸不动的情况下保持变化,我在ios中使用ML Kit,并按照google的文档进行。

文档:https://developers.google.com/ml-kit/vision/face-detection/ios#performance_tips

这是我的代码:

func captureOutput(  _ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
         self.detectFaceMLKit(image: sampleBuffer)
}
private func detectFaceMLKit(image: CMSampleBuffer) {
        let image = VisionImage(buffer: image)
        image.orientation = imageOrientation(
            deviceOrientation: UIDevice.current.orientation,
            cameraPosition: cameraPosition)
               
        faceDetector?.process(image) { [self] faces, error in
          guard error == nil, let faces = faces, !faces.isEmpty else {
            //TODO : show error
            return
          }

            // Faces detected
            if faces.count == 1 {
                let face = faces[0]
                let frame = face.frame
                var rotX : CGFloat = 0
                var rotY : CGFloat = 0
                var faceTrackingId = 0
                if face.hasHeadEulerAngleX {
                    rotX = face.headEulerAngleX  // Head is rotated to the uptoward rotX degrees
                    print("rotx: \(rotX)")
                }
                if face.hasHeadEulerAngleY {
                    rotY = face.headEulerAngleY  // Head is rotated to the right rotY degrees
                    print("rotY: \(rotY)")
                }
                // If face tracking was enabled:
                if face.hasTrackingID {
                    faceTrackingId = face.trackingID
                    print("trackingId: \(faceTrackingId)")
                }
    }
}

    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
        }
    }

注意:跟踪 id 在开始时可以正常工作,但在 id “10”左右之后,它会失去面部跟踪,并开始为同一张脸提供多重 id,而无需在相机中移动面部。

过滤跟踪id后的输出样本:

trackingId:21 追踪编号:21 追踪编号:21 追踪编号:21 追踪编号:21 追踪编号:21 跟踪ID:22 跟踪ID:22 跟踪ID:22 跟踪ID:22 跟踪ID:22 跟踪ID:23 跟踪ID:23 跟踪ID:23 跟踪ID:23 跟踪ID:23 跟踪ID:24 跟踪ID:24 跟踪ID:24 跟踪ID:24 trackingId: 24

【问题讨论】:

    标签: ios swift xcode firebase-mlkit google-mlkit


    【解决方案1】:

    问题是 imageOrientation,我只在 Xcode 中将方向设置为纵向,但基于 UIDeviceOrientation 旋转图像是错误的,通过将 imageOrientation 设置为固定在 .up 位置来修复它。

    编辑: 另外,请确保不要像这样覆盖输出图像方向:

     private let videoDataOutput = AVCaptureVideoDataOutput()
     guard let connection = self.videoDataOutput.connection(with: AVMediaType.video),
                connection.isVideoOrientationSupported else { return }
     connection.videoOrientation = .portrait
    

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 2021-01-12
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2020-03-17
      • 1970-01-01
      相关资源
      最近更新 更多