Edited at

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

More than 5 years have 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


おしまい

以上の方法で簡単に好きなアイドルに一瞬でヒゲを描く事ができるようになります。

ぜひ自分の好きな写真をおかずに遊んでみて下さい。