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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)