Обнаружение лица в реальном времени с камеры в реальном времени (не со статического изображения) с использованием Vision & AVFoundation Framework - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно распознать настоящее лицо с фронтальной камеры 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
                        }
                    }
                }
            }
        }

Так есть ли способ сделать это, используя только в режиме реального времениобнаружение камеры?Буду очень признателен за вашу помощь и совет

...