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)
http://docs.fabo.io/swift/coreimage/img/coreimage004.png
Reference
CIFilter
https://developer.apple.com/reference/coreimage/cifilter
CIImage
https://developer.apple.com/reference/coreimage/ciimage
CIDetector
https://developer.apple.com/reference/coreimage/cidetector
CGAffineTransform
https://developer.apple.com/reference/coregraphics/cgaffinetransform
Reference
CIFilter
https://developer.apple.com/reference/coreimage/cifilter
CIImage
https://developer.apple.com/reference/coreimage/ciimage
CIDetector
https://developer.apple.com/reference/coreimage/cidetector
CGAffineTransform
https://developer.apple.com/reference/coregraphics/cgaffinetransform
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.