2017-04-09 10 views
0

私はUIDmageで顔を検出するためにCIDetectorを使用しています。私は顔の矩形を正しく取得していますが、検出された顔の矩形に画像をトリミングすると発生します。それは私のイメージビューに表示されていません。CIDetector、検出された顔画像が表示されていませんか?

私はすでにチェックしています。私のイメージは、ここではnil

ではありません私のコードです: -

@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! 
} 
} 

詳細については、私は値のスクリーンショットを添付しています。

スクリーンショット1 Screen Shot 1

スクリーンショット2 Screen Shot 2

スクリーンショット3 Screen Shot 3

答えて

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) 
+0

あなたは私が間違って何をしていたか説明していただけます? –

+0

@PawanJoshi前にこの問題に直面していましたが、なぜ直接変換が機能しないのかわかりません。しかし、他の人々もこの問題に直面しているようです:[http://stackoverflow.com/questions/40939075/unable-to-convert-ciimage-to-uiimage-in-swift-3-0](http://stackoverflow .com/questions/40939075/ciimage-to-uiimage-in-swift-3-0) – chengsam