使用Vision&AVFoundation Framework从实时摄像头(不是从静态图像)进行实时人脸检测

时间:2019-04-03 20:08:50

标签: ios swift real-time face-detection vision

我需要从iPhone前置摄像头检测真实面孔。因此,我已经使用视觉框架来实现它。但是它也可以从静态图像(人像)中检测到面部,这也不是必需的。这是我的代码段。

 class ViewController {

 func sessionPrepare() {
        session = AVCaptureSession()
        guard let session = session, let captureDevice = frontCamera else { return }

        do {
            let deviceInput = try AVCaptureDeviceInput(device: captureDevice)
            session.beginConfiguration()

            if session.canAddInput(deviceInput) {
                session.addInput(deviceInput)
            }

            let output = AVCaptureVideoDataOutput()
            output.videoSettings = [
                String(kCVPixelBufferPixelFormatTypeKey) : Int(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)
            ]

            output.alwaysDiscardsLateVideoFrames = true

            if session.canAddOutput(output) {
                session.addOutput(output)

            }

            session.commitConfiguration()
            let queue = DispatchQueue(label: "output.queue")
            output.setSampleBufferDelegate(self, queue: queue)
            print("setup delegate")
        } catch {
            print("can't setup session")
        }
    }
}


}

如果我将其放在相机前面,它也会从静态图像中检测到人脸。

 extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate {

        func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

            let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

            let attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate)

            let ciImage = CIImage(cvImageBuffer: pixelBuffer!, options: attachments as! [String : Any]?)

            let ciImageWithOrientation = ciImage.applyingOrientation(Int32(UIImageOrientation.leftMirrored.rawValue))

            detectFace(on: ciImageWithOrientation)
        }

    }

    func detectFace(on image: CIImage) {
            try? faceDetectionRequest.perform([faceDetection], on: image)
            if let results = faceDetection.results as? [VNFaceObservation] {
                if !results.isEmpty {
                    faceLandmarks.inputFaceObservations = results
                    detectLandmarks(on: image)

                    DispatchQueue.main.async {
                        self.shapeLayer.sublayers?.removeAll()
                    }
                }
            }
        }

        func detectLandmarks(on image: CIImage) {
            try? faceLandmarksDetectionRequest.perform([faceLandmarks], on: image)
            if let landmarksResults = faceLandmarks.results as? [VNFaceObservation] {
                for observation in landmarksResults {
                    DispatchQueue.main.async {
                        if let boundingBox = self.faceLandmarks.inputFaceObservations?.first?.boundingBox {
                            let faceBoundingBox = boundingBox.scaled(to: self.view.bounds.size)
                            //different types of landmarks
                            let faceContour = observation.landmarks?.faceContour
                            let leftEye = observation.landmarks?.leftEye
                            let rightEye = observation.landmarks?.rightEye
                            let nose = observation.landmarks?.nose
                            let lips = observation.landmarks?.innerLips
                            let leftEyebrow = observation.landmarks?.leftEyebrow
                            let rightEyebrow = observation.landmarks?.rightEyebrow
                            let noseCrest = observation.landmarks?.noseCrest
                            let outerLips = observation.landmarks?.outerLips
                        }
                    }
                }
            }
        }

那么有什么方法可以仅通过实时摄像机检测来完成它?非常感谢您的帮助和建议

1 个答案:

答案 0 :(得分:0)

我需要做同样的事情,最后经过大量实验,我发现了 https://github.com/syaringan357/iOS-MobileFaceNet-MTCNN-FaceAntiSpoofing

它仅检测实时摄影机的脸部。但是它没有使用Vision框架。