SwiftとCIDetectorで効率よくアイドルの写真にヒゲを書き加える方法

More than 1 year has passed since last update.

girl_hige.png

はじめに

最近のアイドルは、1グループあたりの人数が多すぎて、効率よくヒゲを描かないと時間がまったく足りなくなってしまいました。
さて、iOSのCIDetectorTypeFaceを使用する事で簡単に顔を認識できることからA○B48人分の顔抽出を試して効率よくヒゲを描いてみたいと思います。

注.ここで紹介する画像はフリーの人物素材画像を使用しています。
http://www.photo-ac.com/ (人物)
http://www.irasutoya.com/2013/08/blog-post_8023.html (ひげ画像)
自身で遊ぶ場合は、ぜひ好きなアイドル画像をおかずに楽しんで下さい。

Xcode6 Beta をダウンロードします.

iOSDevCenterからDLできます。
(iOS Developer Programへの登録(有償)が必要です)
https://developer.apple.com/devcenter/ios/index.action

SinglePageViewを作成します

スクリーンショット 2014-07-03 22.48.05.png

ProductNameを設定しましょう

スクリーンショット 2014-07-03 22.59.44.png

BuildPurchase->CoreImage.frameworkを選択します

スクリーンショット 2014-07-03 23.02.29.png

写真をドラッグ&ドロップしてプロジェクトに取り込みます

スクリーンショット 2014-07-03 23.38.17.png

読み込むときにCopy Imagesにチェックを付けておきましょう.

スクリーンショット 2014-07-03 23.38.25.png

storyboardでImageViewをドラッグ&ドロップします

スクリーンショット 2014-07-03 23.00.30.png

ImageViewのImageに取り込んだ写真の名前が出てくるので選択すると画面に写真が表示されます

スクリーンショット 2014-07-03 23.39.24.png

ImageViewをコードに追加します(右、左クリックしたままスライドさせる)

スクリーンショット 2014-07-03 23.00.56.png

ViewController.swiftにロジックを記述します

ソースコードはgithubにあげています。下記をそのままCopy&PastすればOK.
https://github.com/oggata/FacialRecognition/blob/master/FacialRecognition/ViewController.swift
(以下にViewController.swift内部の簡単な解説を記載しますので参考にしてください)

(コード解説)画像処理にはCIImageクラスを使います

画像に関するクラスは複数用意されていますが、用途によって変換をして使い、
今回は画像処理が目的なのでCIImageを使用します。

UIImage : Viewとして表示するための画像クラス
CIImage : CoreImageは画像処理のための画像クラス
NSImage : Cocoaで画像データを扱う為のクラス
CGImage : UIImageに含まれる

たとえば、UIImageクラスで作成された画像を使いたければ変換することもできます。
var uiImage = UIImage(named:"p2.jpg")
var ciImage = CIImage(CGImage:uiImage.CGImage)

(コード解説)顔検出のやり方

解析の精度はoptionsで指定できます。
(options)
CIDetectorAccuracyLow - 精度は低いが、パフォーマンスは良い
CIDetectorAccuracyHigh - 精度は高いが、パフォーマンスは悪い

var ciDetector = CIDetector(
    ofType:CIDetectorTypeFace
    ,context:nil
    ,options:[
        CIDetectorAccuracy:CIDetectorAccuracyHigh,
        CIDetectorSmile:true
    ]
)

(コード解説)解析結果

結果は下記のような感じで座標が返ってきます。
CoreImageの座標系は左下が(0,0)になることに注意が必要です。(UI系は左上が(0,0))
bounds - 顔の範囲
hasLeftEyePosition - 左目の位置を検出できたか
hasMouthPosition - 口の位置を検出できたか
hasRightEyePosition - 右目の位置を検出できたか
leftEyePosition - 左目の位置
mouthPosition - 口の位置
rightEyePosition - 右目の位置

シュミレーターで実行

おおお。上手にヒゲが描けました。

女性にヒゲ
face001.png

外国の人にヒゲ
face002.png

集合写真にヒゲ
face003.png

おしまい

以上の方法で簡単に好きなアイドルに一瞬でヒゲを描く事ができるようになります。
ぜひ自分の好きな写真をおかずに遊んでみて下さい。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.