1

I am using CIDetector to detect face in a UIImage. i am getting the face rect correctly but when i crop the image to detected face rect. it is not showing on my image view.

I have already checked. my image is not nil

Here is my code :-

@IBAction func detectFaceOnImageView(_: UIButton) {
    let image = myImageView.getFaceImage()
    myImageView.image = image
}


extension UIView {

func getFaceImage() -> UIImage? {
    let faceDetectorOptions: [String: AnyObject] = [CIDetectorAccuracy: CIDetectorAccuracyHigh as AnyObject]

    let faceDetector: CIDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: faceDetectorOptions)!

    let viewScreenShotImage = generateScreenShot(scaleTo: 1.0)

    if viewScreenShotImage.cgImage != nil {
        let sourceImage = CIImage(cgImage: viewScreenShotImage.cgImage!)
        let features = faceDetector.features(in: sourceImage)
        if features.count > 0 {
            var faceBounds = CGRect.zero
            var faceImage: UIImage?
            for feature in features as! [CIFaceFeature] {
                faceBounds = feature.bounds
                let faceCroped: CIImage = sourceImage.cropping(to: faceBounds)
                faceImage = UIImage(ciImage: faceCroped)
            }
            return faceImage
        } else {
            return nil
        }
    } else {
        return nil
    }
}

func generateScreenShot(scaleTo: CGFloat = 3.0) -> UIImage {
    let rect = self.bounds
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
    let context = UIGraphicsGetCurrentContext()
    self.layer.render(in: context!)
    let screenShotImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    let aspectRatio = screenShotImage.size.width / screenShotImage.size.height
    let resizedScreenShotImage = screenShotImage.scaleImage(toSize: CGSize(width: self.bounds.size.height * aspectRatio * scaleTo, height: self.bounds.size.height * scaleTo))
    return resizedScreenShotImage!
}
}

For More Information, I am attaching Screen Shots of values .

Screen Shot 1 Screen Shot 1

Screen Shot 2 Screen Shot 2

Screen Shot 3 Screen Shot 3

Pawan Joshi
  • 1,581
  • 3
  • 20
  • 40

1 Answers1

3

Try this:

let faceCroped: CIImage = sourceImage.cropping(to: faceBounds)
//faceImage = UIImage(ciImage: faceCroped)
let cgImage: CGImage = {
    let context = CIContext(options: nil)
    return context.createCGImage(faceCroped, from: faceCroped.extent)!
}()

faceImage = UIImage(cgImage: cgImage)
chengsam
  • 7,315
  • 6
  • 30
  • 38
  • 1
    @PawanJoshi I faced this problem before and I have no idea why direct conversion doesn't work. However, seems other people face this problem as well: [http://stackoverflow.com/questions/40939075/unable-to-convert-ciimage-to-uiimage-in-swift-3-0](http://stackoverflow.com/questions/40939075/unable-to-convert-ciimage-to-uiimage-in-swift-3-0) – chengsam Apr 10 '17 at 09:19