iOS5での顔検証

iPhone

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が表示されるかと思います!
簡単に顔を認証できます!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です