2016-12-20 6 views
2

Этот код не показывает обнаружение лица в камере, даже если нет ошибки. Я хочу, чтобы лицо было обнаружено в реальном времени в камере с окруженным красным сквайром, но я думаю, что я не правильно разместил код или где-то я должен поместить что-то в Viewdidload или что-то еще?Обнаружение лица в реальном времени не работает

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

не могли бы вы поделиться учебником, в котором вы взяли этот код? –

+0

@TungFam вот ссылка: http://www.appcoda.com/face-detection-core-image/ –

+0

Я не уверен, если вы спросили правильно, но вы сказали: «Этот код не показывает обнаружение лица в камере ". Согласно учебному пособию, он должен показывать лицо на изображении, но не в режиме реального времени. –

ответ

0

Вы, скорее всего, нужно просто вызвать функцию способа, как это описано в документе

Мы будем вызывать метод обнаружения в viewDidLoad. Так вставьте следующую строку кода в методе:

override func viewDidLoad() { 
    super.viewDidLoad() 

    detect() 

}

Скомпилировать и запустить приложение.

EDIT: Это решение, в то время как функция «обнаружение» является методом подкласса, но в вашем случае вы используете IBAction, который имеет другой синтаксис, подобный этому. Вы должны попытаться удалить имя функции обнаружения() и этот кронштейн

} 

let picker = 

и эта часть должна внутри функции

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

для вашего случая вы, вероятно, можете пропустить эту часть, а также.

+0

Использование ошибки неразрешенного идентификатора «обнаружить» –

+0

Я также очистил и запустил, но получил эту ошибку –

+0

@Solangi Какова версия SWIFT, которую вы используете? Раньше в старых версиях было необходимо использовать self.detect() – Vanya

0

Просмотрев свой код, вы даже не позвонили detect() после того, как сделаете щелчок. Я попытался исправить его, как описано ниже, однако detect() вернет нулевую грань, найденную, как я опишу в 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

Пока не обнаружено! И я также попытался упомянуть detect() в viewdidload, но он дает возможность фатальной ошибки для разворачивания ошибки, если вы обновите изменения в коде моего вопроса при обновлении в ответ? –

+0

Он будет сбой при вызове 'detect()' в 'viewDidLoad()', потому что imageView.image не установлен в начале – WeiJay

+0

Но он не обнаруживает, что бы вы что-то обновили? –