Pawan Joshi
Pawan Joshi

Reputation: 1579

CIDetector , detected face image is not showing?

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

Upvotes: 1

Views: 869

Answers (1)

chengsam
chengsam

Reputation: 7405

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)

Upvotes: 3

Related Questions