数年前に書いた下記記事が古くなってきたので、Swift編 として書き直しました。
【Tips】iOSの顔検出機能を使ってみる - koogawa blog
iOS 5から追加された CIDetector
を使って、顔検出機能を使う方法をメモしておきます。
実装方法
まずは「CoreImage.framework」を追加します。
インスタンスを生成します。
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
クラスで指定します。
今回は検出された顔が笑っているかどうかも検出したいので options
に CIDetectorSmile
をセットしました。
正常に顔が検出されると、検出結果が 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)
これで顔検出ができました。
顔検出というと難しそうなイメージが有りますが、座標系のところ以外は、意外と簡単に使用できますね。
サンプル
補足
- iOS 8からはQRコードや画像の中の四角形も検出できるようになったようです
- iOS 9からは文字検出もできるようになったようです(文字の領域を検出するもので、文字の内容までは認識できない)
- 【iOS 9】Core Image の新機能:文字認識/追加フィルタ47種 - その後のその後