2017-04-13 7 views
4

Ich versuche eine einfache Kamera-Anwendung zu machen, wo die Frontkamera Gesichter erkennen kann. Dies sollte genug einfach sein:iOS Kamera Gesichtsstrecke (Swift 3 Xcode 8)

  • eine CameraView Klasse erstellen, die von UIImage erbt und es in der Benutzeroberfläche platzieren. Stellen Sie sicher, dass AVCaptureVideoDataOutputSampleBufferDelegate implementiert ist, um Frames von der Kamera in Echtzeit zu verarbeiten.

    class CameraView: UIImageView, AVCaptureVideoDataOutputSampleBufferDelegate 
    
  • Innerhalb einer Funktion handleCamera, aufgerufen, wenn die CameraView instanziert wird, Setup eine AVCapture Sitzung. Fügen Sie einen Eingang von der Kamera hinzu.

    override init(frame: CGRect) { 
        super.init(frame:frame) 
    
        handleCamera() 
    } 
    
    func handleCamera() { 
        camera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, 
                  mediaType: AVMediaTypeVideo, position: .front) 
        session = AVCaptureSession() 
    
        // Set recovered camera as an input device for the capture session 
        do { 
         try input = AVCaptureDeviceInput(device: camera); 
        } catch _ as NSError { 
         print ("ERROR: Front camera can't be used as input") 
         input = nil 
        } 
    
        // Add the input from the camera to the capture session 
        if (session?.canAddInput(input) == true) { 
         session?.addInput(input) 
        } 
    
  • Ausgabe erstellen. Erstellen Sie eine serielle Ausgabewarteschlange, um die Daten zu übergeben, die dann von AVCaptureVideoDataOutputSampleBufferDelegate (in diesem Fall die Klasse selbst) verarbeitet werden. Fügen Sie der Sitzung eine Ausgabe hinzu.

    output = AVCaptureVideoDataOutput() 
    
        output?.alwaysDiscardsLateVideoFrames = true  
        outputQueue = DispatchQueue(label: "outputQueue") 
        output?.setSampleBufferDelegate(self, queue: outputQueue) 
    
        // add front camera output to the session for use and modification 
        if(session?.canAddOutput(output) == true){ 
         session?.addOutput(output) 
        } // front camera can't be used as output, not working: handle error 
        else { 
         print("ERROR: Output not viable") 
        } 
    
  • Konfiguration der Kamera in einer Vorschau und führen die Sitzung

    // Setup camera preview with the session input 
        previewLayer = AVCaptureVideoPreviewLayer(session: session) 
        previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
        previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
        previewLayer?.frame = self.bounds 
        self.layer.addSublayer(previewLayer!) 
    
        // Process the camera and run it onto the preview 
        session?.startRunning() 
    
  • in der captureOutput Funktion vom Delegierten ausführen, wandeln die Empfangenes-Probenpuffer zu CIImage um Gesichter zu erkennen. Gib Feedback, wenn ein Gesicht gefunden wird.

    func captureOutput(_ captureOutput: AVCaptureOutput!, didDrop sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 
    
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
    let cameraImage = CIImage(cvPixelBuffer: pixelBuffer!) 
    
    
    let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh] 
    let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy) 
    let faces = faceDetector?.features(in: cameraImage) 
    
    for face in faces as! [CIFaceFeature] { 
    
         print("Found bounds are \(face.bounds)") 
    
         let faceBox = UIView(frame: face.bounds) 
    
         faceBox.layer.borderWidth = 3 
         faceBox.layer.borderColor = UIColor.red.cgColor 
         faceBox.backgroundColor = UIColor.clear 
         self.addSubview(faceBox) 
    
         if face.hasLeftEyePosition { 
          print("Left eye bounds are \(face.leftEyePosition)") 
         } 
    
         if face.hasRightEyePosition { 
          print("Right eye bounds are \(face.rightEyePosition)") 
         } 
        } 
    } 
    

Mein Problem: Ich habe die Kamera bekommen kann laufen, aber mit der Vielzahl unterschiedlicher Codes ich aus dem ganzen Internet versucht habe, ich habe captureOutput nie in der Lage zu bekommen, um ein Gesicht zu erkennen. Entweder tritt die Anwendung nicht in die Funktion ein oder sie stürzt wegen einer Variablen ab, die nicht funktioniert, wobei die Variable samplyBuffer am häufigsten Null ist. Was mache ich falsch?

Antwort

1

Sie benötigen captureOutput Funktionsargumente an folgende Änderungen: func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!)

Ihre captureOutput Funktion aufruft, wenn der Puffer fällt, nicht, wenn sie von der Kamera bekommt.

+0

Ich fand das tatsächlich mit Hilfe eines iOS-Entwicklers auf meinem Praktikum und vergaß, die Frage zu aktualisieren. Dies war effektiv alles, was fehlte, danke fürs Durchschauen und hoffentlich hilft das jemand anderem. – KazToozs