2016-12-20 6 views
2

Ce code ne montre pas la détection de visage dans l'appareil photo, même s'il n'y a pas d'erreur. Je veux que le visage soit détecté en temps réel à huis clos avec le squire rouge entouré, mais je pense que je n'ai pas placé le code correctement ou que je devrais placer quelque chose dans Viewdidload ou autre chose?La détection de visage en temps réel ne fonctionne pas

import UIKit 
import CoreImage 

class ViewController: UIViewController ,UIAlertViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

@IBOutlet var imageView: UIImageView! 
@IBAction func Moodify(_ sender: UIButton) { 


    func detect() { 

     guard let personciImage = CIImage(image: imageView.image!) else { 
      return 
     } 

     let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh] 
     let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy) 
     let faces = faceDetector?.features(in: personciImage) 


     // For converting the Core Image Coordinates to UIView Coordinates 
     let ciImageSize = personciImage.extent.size 
     var transform = CGAffineTransform(scaleX: 1, y: -1) 
     transform = transform.translatedBy(x: 0, y: -ciImageSize.height) 

     for face in faces as! [CIFaceFeature] { 

      print("Found bounds are \(face.bounds)") 

      // Apply the transform to convert the coordinates 
      var faceViewBounds = face.bounds.applying(transform) 

      // Calculate the actual position and size of the rectangle in the image view 
      let viewSize = imageView.bounds.size 
      let scale = min(viewSize.width/ciImageSize.width, 
          viewSize.height/ciImageSize.height) 
      let offsetX = (viewSize.width - ciImageSize.width * scale)/2 
      let offsetY = (viewSize.height - ciImageSize.height * scale)/2 

      faceViewBounds = faceViewBounds.applying(CGAffineTransform(scaleX: scale, y: scale)) 
      faceViewBounds.origin.x += offsetX 
      faceViewBounds.origin.y += offsetY 

      let faceBox = UIView(frame: faceViewBounds) 
      //let faceBox = UIView(frame: face.bounds) 
      faceBox.layer.borderWidth = 3 
      faceBox.layer.borderColor = UIColor.red.cgColor 
      faceBox.backgroundColor = UIColor.clear 
      imageView.addSubview(faceBox) 

      if face.hasLeftEyePosition { 
       print("Left eye bounds are \(face.leftEyePosition)") 
      } 

      if face.hasRightEyePosition { 
       print("Right eye bounds are \(face.rightEyePosition)") 
      } 
     } 
    } 

    let picker = UIImagePickerController() 
    picker.delegate = self 
    picker.allowsEditing = true 
    picker.sourceType = .camera 
    picker.cameraDevice = .front 
    self.present(picker, animated: true, completion: { _ in }) 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [AnyHashable: Any]) { 
     let chosenImage = info[UIImagePickerControllerEditedImage] 
     self.imageView!.image = chosenImage as? UIImage 
     picker.dismiss(animated: true, completion: { _ in }) 
    } 

    // picker.dismiss(animated: true, completion: { _ in }) 
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
     picker.dismiss(animated: true, completion: { _ in }) 
    } 
} 

override func viewDidLoad() { 

    let alert = UIAlertController(title: "Ooops!!!", message: "Camera is not connected", preferredStyle: UIAlertControllerStyle.alert) 
    alert.addAction(UIAlertAction(title: "Connect", style: UIAlertActionStyle.default, handler: nil)) 
    self.present(alert, animated: true, completion: nil) 

    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
} 
+0

pouvez-vous s'il vous plaît partager le tutoriel d'où vous avez pris ce code? –

+0

@TungFam voici le lien: http://www.appcoda.com/face-detection-core-image/ –

+0

Je ne suis pas sûr si vous avez demandé d'une manière correcte, mais vous avez déclaré "Ce code ne montre pas la détection de visage à huis clos ". Selon le tutoriel, il devrait montrer le visage sur l'image, mais pas à huis clos en temps réel. –

Répondre

0

Vous avez besoin plus probablement pour déclencher la fonction de la manière dont il est décrit dans le document

Nous invoquerons la méthode dans la détection viewDidLoad. insérer Ainsi, la ligne de code suivante dans la méthode:

override func viewDidLoad() { 
    super.viewDidLoad() 

    detect() 

}

Compilez et exécutez l'application.

EDIT: Ceci est une solution alors que la fonction "detect" est comme une méthode de sous-classe, mais dans votre cas, vous utilisez IBAction, qui a une syntaxe différente comme ceci. Vous devriez essayer de supprimer le nom de la fonction détecter() et ce support

} 

let picker = 

et cette partie ont à l'intérieur d'une fonction

let picker = UIImagePickerController() 
picker.delegate = self 
picker.allowsEditing = true 
picker.sourceType = .camera 
picker.cameraDevice = .front 
self.present(picker, animated: true, completion: { _ in }) 

pour votre cas, vous pouvez probablement omettre cette partie aussi.

+0

Utilisation de l'identifiant non résolu "detect" error –

+0

J'ai également nettoyé et exécuté mais j'ai eu cette erreur –

+0

@Solangi Quelle est la version de SWIFT que vous utilisez? Avant dans les anciennes versions, il était nécessaire d'utiliser self.detect() – Vanya

0

Après avoir parcouru votre code, vous n'avez même pas appelé detect() après avoir pris un instantané. J'ai essayé de le fixer comme décrit ci-dessous, cependant, le detect() retournera zéro visage trouvé comme je décris dans Face Detection with Camera.

lazy var picker: UIImagePickerController = { 
    let picker = UIImagePickerController() 
    picker.delegate = self 
    picker.allowsEditing = true 
    picker.sourceType = .camera 
    picker.cameraDevice = .front 
    return picker 
}() 

@IBOutlet var imageView: UIImageView! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    imageView.contentMode = .scaleAspectFit 
} 

@IBAction func TakePhoto(_ sender: Any) { 
    self.present(picker, animated: true, completion: nil) 
} 

// MARK: - UIImagePickerControllerDelegate 
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    if let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     self.imageView!.image = chosenImage 
     // Got the image from camera, the imageView.image is not nil, so it's time for facial detection 
     detect() 
     picker.dismiss(animated: true, completion: nil) 
    } 
} 


func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    picker.dismiss(animated: true, completion: nil) 
} 

// MARK: - Face Detection 

func detect() { 

    guard let personciImage = CIImage(image: imageView.image!) else { 
     return 
    } 

    let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh] 
    let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy) 
    let faces = faceDetector?.features(in: personciImage) 


    // For converting the Core Image Coordinates to UIView Coordinates 
    let ciImageSize = personciImage.extent.size 
    var transform = CGAffineTransform(scaleX: 1, y: -1) 
    transform = transform.translatedBy(x: 0, y: -ciImageSize.height) 
    print("faces.count = \(faces?.count)") 

    for face in faces as! [CIFaceFeature] { 

     print("Found bounds are \(face.bounds)") 

     // Apply the transform to convert the coordinates 
     var faceViewBounds = face.bounds.applying(transform) 

     // Calculate the actual position and size of the rectangle in the image view 
     let viewSize = imageView.bounds.size 
     let scale = min(viewSize.width/ciImageSize.width, 
         viewSize.height/ciImageSize.height) 
     let offsetX = (viewSize.width - ciImageSize.width * scale)/2 
     let offsetY = (viewSize.height - ciImageSize.height * scale)/2 

     faceViewBounds = faceViewBounds.applying(CGAffineTransform(scaleX: scale, y: scale)) 
     faceViewBounds.origin.x += offsetX 
     faceViewBounds.origin.y += offsetY 

     let faceBox = UIView(frame: faceViewBounds) 
     //let faceBox = UIView(frame: face.bounds) 
     faceBox.layer.borderWidth = 3 
     faceBox.layer.borderColor = UIColor.red.cgColor 
     faceBox.backgroundColor = UIColor.clear 
     imageView.addSubview(faceBox) 

     if face.hasLeftEyePosition { 
      print("Left eye bounds are \(face.leftEyePosition)") 
     } 

     if face.hasRightEyePosition { 
      print("Right eye bounds are \(face.rightEyePosition)") 
     } 
    } 
} 
+0

Il ne détecte pas encore! Et j'ai aussi essayé de mentionner detect() dans viewdidload mais cela donne une erreur fatale error unwrapping facultatif mettriez-vous à jour les changements dans le code de ma question lorsque vous mettez à jour en réponse? –

+0

Il se bloquerait lorsque vous appelez 'detect()' dans 'viewDidLoad()' parce que imageView.image n'est pas défini au début – WeiJay

+0

Mais il ne détecte pas mettre à jour quelque chose? –