ミライスタート TECH系ブログ

株式会社ミライスタートのエンジニア達が気になったTECH系の記事等をアップしています!

CIImage→顔発見→顔トリミング→UIImageで保存する方法

こんにちわ。エンジニアの横田です。
今回の記事は備忘録です。
カメラから取得したCVPixelBufferRefを変換したCIImageから顔を発見し、その顔領域だけをトリミングしてUIImageとして保存する処理についてです。
ちなみに最初引っかかったのですが、Face DetectionとFace Recognitionは別物だそうです。画像から顔を見つけるだけだとそれはFace Detectionと言うらしいです。見つけた顔からさらに個人を識別する処理のことをFace Recogitionと言って、それを日本語と対応させると顔認識となるのでないかと思います。顔を見つけるだけだと、顔検出と言うと正しいみたいです。

         let options = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
         let detector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: options)
         let pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)!
         let features = detector.featuresInImage(ciImage, options: [CIDetectorImageOrientation: 6])

         for feature in features as! [CIFaceFeature] {
             let croppedFaceCIImage = ciImage.imageByCroppingToRect(feature.bounds)

             let uiimage = UIImage(CIImage: croppedFaceCIImage, scale: 1.0, orientation: UIImageOrientation.Right)
          }

ちなみにカメラは縦方向固定で撮影することを想定しています。
iOSバイスの場合、画面をホームボタンが右側に来るよう横方向にした状態が標準状態で、そこから右に90度回転させた方向になります。
そのため、まずfeaturesInImageのオプションで顔を探すときに、画像の方向として右に90度を表す6を指定する必要があります。
数値と回転角度の対応は、こちらの記事が分かりやすかったです。
iPhoneやiPadで撮影した画像を他のデバイスで見ると自動で回転してしまう場合の対処法 | IsaB
そしてCIImageからUIImage化する際にも同じく、回転角度の指定をしてやればいいです。