iOS 5 になって CIDetector というクラスを使って画像の顔認識ができるようになりました。
ということで、顔の上にUIViewを表示してみよう!
まず、
※注意として、CoreImageは左下の座標が(0,0)になります。(通常UIKitは、左上が(0,0))
CIImage* image = [CIImage imageWithCGImage:【顔の写った写真を表示するUIImageView】.image.CGImage];
※精度がhighの顔認識(CIDetectorTypeFace)を生成
CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:[NSDictionary dictionaryWithObject:
CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];
※認識された顔のパーツを配列に入れます
NSArray* features = [detector featuresInImage:image];
※CoreImageは、左下の座標が (0,0) となるので、顔認証された画像を描画する前に、
UIKitと同じ座標関係にしましょう!
この時、そのまま逆さまにしただけだと、他のオブジェクトも逆さまになってしまうので、
わけがわからなくなる!
CGAffineTransform transform = CGAffineTransformMakeScale(1, -1);
transform = CGAffineTransformTranslate(transform, 0, -facePicture.bounds.size.height);
※この処理を顔の各パーツごとに繰り返します。
CIFaceFeature は目、鼻、口が検出されたかをBOOlで返してくれ、
それぞれのサイズも教えてくれるので便利です!
今回は顔全体と鼻だけを例にとります。
for(CIFaceFeature* faceFeature in features)
{
※顔のRectを取得し、UIKitの座標に合わせます
const CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform);
※顔と同じ大きさのUIViewを生成します
UIView* faceView = [[UIView alloc] initWithFrame:faceRect];
faceView.layer.borderWidth = 1;
faceView.layer.borderColor = [[UIColor yellowColor] CGColor];
faceWidth = faceFeature.bounds.size.width;
※これで顔の周りにボーダーを表示され、顔が認証されたとわかります!
[facePicture addSubview:faceView];
※口が検出されてたら・・・の処理
if(faceFeature.hasMouthPosition)
{
※口の座標をゲットして、UIKitの座標に変換!
const CGPoint mouthPos = CGPointApplyAffineTransform(faceFeature.mouthPosition, transform);
※顔の大きさに応じて口の上に表示するUIViewの大きさを変えよう!
UIView* mouth = [[UIView alloc] initWithFrame : CGRectMake(mouthPos.x – faceWidth*MOUTH_SIZE_RATE*0.5,
mouthPos.y – faceWidth*MOUTH_SIZE_RATE*0.5,
faceWidth*MOUTH_SIZE_RATE,
faceWidth*MOUTH_SIZE_RATE)];
mouthPoint = CGPointMake(mouthPos.x – faceWidth*MOUTH_SIZE_RATE*0.5, mouthPos.y – faceWidth*MOUTH_SIZE_RATE*0.5);
UIColor* pink = [UIColor colorWithRed:1 green: 0.6 blue:0.8 alpha:1];
mouth.backgroundColor = [pink colorWithAlphaComponent:0.3];
mouth.layer.cornerRadius = faceWidth*MOUTH_SIZE_RATE*0.5;
[facePicture addSubview:mouth];
}
}
これで、顔の周りにボーダー、口にピンクのUIViewが表示されるかと思います!
簡単に顔を認証できます!