iOS ML Kit人脸跟踪无法正常工作

问题描述

人脸不动时,人脸检测的跟踪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 trackingId:21 trackingId:21 trackingId:21 trackingId:21 trackingId:21 trackingId:22 trackingId:22 trackingId:22 trackingId:22 trackingId:22 trackingId:23 trackingId:23 trackingId:23 trackingId:23 trackingId:23 trackingId:24 trackingId:24 trackingId:24 trackingId:24 trackingId:24

解决方法

问题是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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...