004 顔認識

Swift3.0に対応した新サイトオープンしました。

http://docs.fabo.io/swift/


Preview


Source

ViewController.swift

//

//  ViewController.swift

//  CoreImage004

//


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を生成。顔認識の精度を追加する.

        var options : NSDictionary = NSDictionary(object: CIDetectorAccuracyHigh, forKey: CIDetectorAccuracy)

        

        // CIDetectorを生成。顔認識をするのでTypeCIDetectorTypeFace.

        var detector : CIDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: options as [NSObject : AnyObject])

        

        // detectorで認識した顔のデータを入れておくNSArray.

        var faces : NSArray = detector.featuresInImage(CIImage(image: myImage))

        

        // UIKitは画面左上に原点があるが、CoreImageは画面左下に原点があるのでそれを揃えなくてはならない.

        // CoreImageUIKitの原点を画面左上に統一する処理.

        var transform : CGAffineTransform = CGAffineTransformMakeScale(1, -1)

        transform = CGAffineTransformTranslate(transform, 0, -myImageView.bounds.size.height)

        

        // 検出された顔のデータをCIFaceFeatureで処理.

        var feature : CIFaceFeature = CIFaceFeature()

        for feature in faces {

            

            // 座標変換.

            let faceRect : CGRect = CGRectApplyAffineTransform(feature.bounds, transform)

            

            // 画像の顔の周りを線で囲うUIViewを生成.

            var faceOutline = UIView(frame: faceRect)

            faceOutline.layer.borderWidth = 1

            faceOutline.layer.borderColor = UIColor.redColor().CGColor

            myImageView.addSubview(faceOutline)

        }

    }

    

}




Reference

    CIDetector Class 

    CIFaceFeature Class

Comments