iOS5から使えるようになったCIDetector
がiOS7で更に進化し、笑顔やまばたき(目をつぶっているかどうか)を検出可能となりました。
すごく簡単に実装できる上に処理も遅くないのでいろいろな使い道があると思います。
下準備
まずCoreImageフレームワークをプロジェクトに追加しておきます。
検出
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil
options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];
CIImage* image = [CIImage imageWithCGImage:uiimage.CGImage];
NSArray *features = [detector featuresInImage:image
options:@{ CIDetectorSmile:@YES,
CIDetectorEyeBlink:@YES,
CIDetectorImageOrientation:[NSNumber numberWithInt:[self exifOrientation:uiimage]]
}
];
for(CIFaceFeature* face in features){
// faceを使って何かする(矩形を描画する、など)
}
画像の向きについて
iOSデバイスのカメラで撮影した画像の場合、撮影時のデバイスの向きに応じて内部的に方向を持っています。その方向というのをCIDetector
のfeaturesInImage
に渡してあげないと正しく検出されません。
uiimage.imageOrientation
によって渡すべき値がことなるので、次のようなメソッドを定義して使いました。
- (NSUInteger)exifOrientation:(UIImage*)image
{
NSUInteger orientation = 0;
switch (image.imageOrientation) {
case UIImageOrientationUp:
orientation = 1;
break;
case UIImageOrientationDown:
orientation = 3;
break;
case UIImageOrientationLeft:
orientation = 8;
break;
case UIImageOrientationRight:
orientation = 6;
break;
case UIImageOrientationUpMirrored:
orientation = 2;
break;
case UIImageOrientationDownMirrored:
orientation = 4;
break;
case UIImageOrientationLeftMirrored:
orientation = 5;
break;
case UIImageOrientationRightMirrored:
orientation = 7;
break;
default:
break;
}
return orientation;
}
笑顔・まばたきの検出
featuresInImage
に渡すオプションに笑顔を検出するかどうか、まばたきを検出するかどうかというオプションを追加しておくと、帰ってくるCIFaceFeature
にそれらの情報が入ってくるようになります。
今回は両方ともYESとしておきました。
CIFaceFeature
次のようなプロパティを持ちます。
- bounds
- leftEyePosition
- rightEyePosition
- mouthPosition
- hasSmile
- leftEyeClosed
- rightEyeClosed
hasSmile
やleftEyeClosed
などで笑顔やまばたきがわかりますね。
フリー写真を使って試してみた
こんな感じです。 ちゃんと笑顔フラグも取れました。