CoreImage 4 Face Detection

Swift 3.0 // // ViewController.swift // CoreImage004 // // Created by Misato Morino on 2016/08/15. // Copyright © 2016年 Misato Morino. All rights reserved. // import UIKit import CoreImage extension UIImage{ // UIImageをリサイズするメソッド. class func ResizeÜIImage(image : UIImage,width : CGFloat, height : CGFloat)-> UIImage!{ // 指定された画像の大きさのコンテキストを用意. UIGraphicsBeginImageContext(CGSize(width: width, height: height)) // コンテキストに自身に設定された画像を描画する. image.draw(in: CGRect(x: 0, y: 0, width: width, height: height)) // コンテキストからUIImageを作る. let newImage = UIGraphicsGetImageFromCurrentImageContext() // コンテキストを閉じる. UIGraphicsEndImageContext() return newImage } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let myImage : UIImage = UIImage.ResizeÜIImage(image: UIImage(named: "sample")!, width: self.view.frame.width, height: self.view.frame.height) // UIImageViewの生成. let myImageView : UIImageView = UIImageView() myImageView.frame = CGRect(x: 0, y: 0, width: myImage.size.width, height: myImage.size.height) myImageView.image = myImage self.view.addSubview(myImageView) // NSDictionary型のoptionを生成。顔認識の精度を追加する. let options : NSDictionary = NSDictionary(object: CIDetectorAccuracyHigh, forKey: CIDetectorAccuracy) // CIDetectorを生成。顔認識をするのでTypeはCIDetectorTypeFace. let detector : CIDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: options as? [String : AnyObject])! // detectorで認識した顔のデータを入れておくNSArray. let faces : NSArray = detector.features(in: CIImage(image: myImage)!) // UIKitは画面左上に原点があるが、CoreImageは画面左下に原点があるのでそれを揃えなくてはならない. // CoreImageとUIKitの原点を画面左上に統一する処理. var transform : CGAffineTransform = CGAffineTransform(scaleX: 1, y: -1) transform = transform.translatedBy(x: 0, y: -myImageView.bounds.size.height) // 検出された顔のデータをCIFaceFeatureで処理. for feature in faces { // 座標変換. let faceRect : CGRect = feature.bounds.applying(transform) // 画像の顔の周りを線で囲うUIViewを生成. let faceOutline = UIView(frame: faceRect) faceOutline.layer.borderWidth = 1 faceOutline.layer.borderColor = UIColor.red.cgColor myImageView.addSubview(faceOutline) } } } Swift 2.3 // // ViewController.swift // CoreImage004 // // Created by Misato Morino on 2016/08/15. // Copyright © 2016年 Misato Morino. All rights reserved. // import UIKit import CoreImage extension UIImage{ // UIImageをリサイズするメソッド. class func ResizeÜIImage(image : UIImage,width : CGFloat, height : CGFloat)-> UIImage!{ // 指定された画像の大きさのコンテキストを用意. UIGraphicsBeginImageContext(CGSizeMake(width, height)) // コンテキストに自身に設定された画像を描画する. image.drawInRect(CGRectMake(0, 0, width, height)) // コンテキストからUIImageを作る. let newImage = UIGraphicsGetImageFromCurrentImageContext() // コンテキストを閉じる. UIGraphicsEndImageContext() return newImage } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let myImage : UIImage = UIImage.ResizeÜIImage(UIImage(named: "sample")!, width: self.view.frame.width, height: self.view.frame.height) // UIImageViewの生成. let myImageView : UIImageView = UIImageView() myImageView.frame = CGRectMake(0, 0, myImage.size.width, myImage.size.height) myImageView.image = myImage self.view.addSubview(myImageView) // NSDictionary型のoptionを生成。顔認識の精度を追加する. let options : NSDictionary = NSDictionary(object: CIDetectorAccuracyHigh, forKey: CIDetectorAccuracy) // CIDetectorを生成。顔認識をするのでTypeはCIDetectorTypeFace. let detector : CIDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: options as? [String : AnyObject]) // detectorで認識した顔のデータを入れておくNSArray. let faces : NSArray = detector.featuresInImage(CIImage(image: myImage)!) // UIKitは画面左上に原点があるが、CoreImageは画面左下に原点があるのでそれを揃えなくてはならない. // CoreImageとUIKitの原点を画面左上に統一する処理. var transform : CGAffineTransform = CGAffineTransformMakeScale(1, -1) transform = CGAffineTransformTranslate(transform, 0, -myImageView.bounds.size.height) // 検出された顔のデータをCIFaceFeatureで処理. for feature in faces { // 座標変換. let faceRect : CGRect = CGRectApplyAffineTransform(feature.bounds, transform) // 画像の顔の周りを線で囲うUIViewを生成. let faceOutline = UIView(frame: faceRect) faceOutline.layer.borderWidth = 1 faceOutline.layer.borderColor = UIColor.redColor().CGColor myImageView.addSubview(faceOutline) } } } 2.xと3.xの差分 init(CIImage:) から init(ciImage:) に変更 CGRectApplyAffineTransform(feature.bounds, transform) から feature.bounds.applying(transform)

Be the first to comment

You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.