首页 文章

CIDetector,检测到的脸部图像没有显示?

提问于
浏览
0

我正在使用CIDetector来检测UIImage中的面部 . 我正确地获得了脸部直接,但是当我将图像裁剪为检测到脸部矩形时 . 它没有显示在我的图像视图上 .

我已经检查过了 . 我的形象不是零

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 .

屏幕截图1
Screen Shot 1

屏幕截图2
Screen Shot 2

屏幕截图3
Screen Shot 3

1 回答

  • 1

    试试这个:

    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)
    

相关问题