koogawa blog

iOS、Android、foursquareに関する話題

【Tips】iOSの顔検出機能を使ってみる(Swift編)

数年前に書いた下記記事が古くなってきたので、Swift編 として書き直しました。

【Tips】iOSの顔検出機能を使ってみる - koogawa blog

f:id:koogawa:20160429092322p:plain


iOS 5から追加された CIDetector を使って、顔検出機能を使う方法をメモしておきます。

実装方法

まずは「CoreImage.framework」を追加します。

f:id:koogawa:20131122152458p:plain

インスタンスを生成します。

let detector = CIDetector(ofType: CIDetectorTypeFace,
                          context: nil,
                          options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])

ofType には検出種類を指定します。今回は顔検出なので、CIDetectorTypeFace を指定します。

options には検出精度 CIDetectorAccuracy 等を指定できます。

  • CIDetectorAccuracyLow - 精度は低いが、パフォーマンスは良い
  • CIDetectorAccuracyHigh - 精度は高いが、パフォーマンスは悪い

次に、顔検出を実行します。

// UIImage から CGImage を作る
let cgImage = image.CGImage
// CGImage から CIImage を作る
let ciImage = CIImage(CGImage: cgImage)
// 顔検出実行
let features = detector.featuresInImage(ciImage,
                           options: [CIDetectorSmile : true])

featuresInImage の引数には、顔検出したい画像を CIImage クラスで指定します。

今回は検出された顔が笑っているかどうかも検出したいので optionsCIDetectorSmile をセットしました。

正常に顔が検出されると、検出結果が CIFaceFeature オブジェクトとして返ってきます。このオブジェクトには、検出された顔の範囲や、目と口の位置などが含まれます。

  • bounds - 顔の範囲
  • hasLeftEyePosition - 左目の位置を検出できたか
  • hasMouthPosition - 口の位置を検出できたか
  • hasRightEyePosition - 右目の位置を検出できたか
  • leftEyePosition - 左目の位置
  • mouthPosition - 口の位置
  • rightEyePosition - 右目の位置
  • hasSmile - 顔が笑っているか
  • leftEyeClosed - 左目が閉じているか
  • rightEyeClosed - 右目が閉じているか

ここで注意したいのは、CoreImage は、左下の座標が (0,0) となる点です。よって、検出元画像の上に部品を載せたい場合は、座標をUIKitの座標系に変換する必要があります。

var transform = CGAffineTransformMakeScale(1, -1);
transform = CGAffineTransformTranslate(transform,
                                       0,
                                       -self.imageView.bounds.size.height);
// UIKit座標系に変換
let faceRect = CGRectApplyAffineTransform(feature.bounds,
                                          transform)

これで顔検出ができました。

顔検出というと難しそうなイメージが有りますが、座標系のところ以外は、意外と簡単に使用できますね。

サンプル

https://github.com/koogawa/iSensorSwift/blob/master/iSensorSwift/Controller/FaceDetectionViewController.swift

f:id:koogawa:20131130175727p:plain

補足