系统人脸识别:iOS 官方人脸检测Demo

/**
 *  注意:CIFaceFeature 提供的坐标都是和CGContext一样是反方向的,所以以下的画图操作都是用了CGContext的方式
 */
- (void)faceRegonized {
    CIContext *context = [CIContext contextWithOptions:nil];
    UIImage *imageInput = [UIImage imageNamed:@"example"];
    CIImage *image = [CIImage imageWithCGImage:imageInput.CGImage];
   
    //设置识别参数
    NSDictionary *param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh
                                                      forKey:CIDetectorAccuracy];
    //声明一个CIDetector,并设定识别类型
    CIDetector* faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace
                                                  context:context options:param];//取得识别结果
    NSArray *detectResult = [faceDetector featuresInImage:image];

    //开始一个画布,并将画布原图画到画布中去
    UIGraphicsBeginImageContext(image.size);
    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);

    for(CIFaceFeature* faceFeature in detectResult) {
        //脸部
        UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
        faceView.layer.borderWidth = 1;
        faceView.layer.borderColor = [UIColor orangeColor].CGColor;
        
        CGFloat faceWidth = faceFeature.bounds.size.width;

        
         //CIFaceFeature 所有的属性
        NSLog(@"-------------------------------------\n");
        NSLog(@"faceBounds = %@",NSStringFromCGRect(faceFeature.bounds));
        NSLog(@"face hasLeftEyePosition = %d",faceFeature.hasLeftEyePosition);
        NSLog(@"face leftEyePosition = %@",NSStringFromCGPoint(faceFeature.leftEyePosition));
        NSLog(@"face hasRightEyePosition = %d",faceFeature.hasRightEyePosition);
        NSLog(@"face rightEyePosition = %@",NSStringFromCGPoint(faceFeature.rightEyePosition));
        NSLog(@"face hasMouthPosition = %d",faceFeature.hasMouthPosition);
        NSLog(@"face mouthPosition = %@",NSStringFromCGPoint(faceFeature.mouthPosition));
        NSLog(@"face hasTrackingID = %d",faceFeature.hasTrackingID);
        NSLog(@"face trackingID = %d",faceFeature.trackingID);
        NSLog(@"face hasTrackingFrameCount = %d",faceFeature.hasTrackingFrameCount);
        NSLog(@"face trackingFrameCount = %d",faceFeature.trackingFrameCount);
        NSLog(@"face hasFaceAngle = %d",faceFeature.hasFaceAngle);
        NSLog(@"face faceAngle = %f",faceFeature.faceAngle);
        NSLog(@"face hasSmile = %d",faceFeature.hasSmile);
        NSLog(@"face leftEyeClosed = %d",faceFeature.leftEyeClosed);
        NSLog(@"face rightEyeClosed = %d",faceFeature.rightEyeClosed);
        NSLog(@"\n-------------------------------------");
       
        //画一个矩形出识别出来的脸部的方位
        UIBezierPath *path = [UIBezierPath bezierPath];
        CGPoint point = faceFeature.bounds.origin;
        CGSize size = faceFeature.bounds.size;
        [path moveToPoint:point];
        [path addLineToPoint:CGPointMake(point.x + size.width, point.y)];
        [path addLineToPoint:CGPointMake(point.x + size.width, point.y + size.height)];
        [path addLineToPoint:CGPointMake(point.x, point.y+ size.height)];
        [path addLineToPoint:point];
        [[UIColor redColor] setStroke];
        [path stroke];
       
        [[UIColor redColor] setStroke];
        [path stroke];

        //左眼
        if (faceFeature.hasLeftEyePosition) {
            [self drawCycleAtPoint:faceFeature.leftEyePosition withRadius:faceWidth*0.1];
        }
       
        //右眼
        if (faceFeature.hasRightEyePosition) {
             [self drawCycleAtPoint:faceFeature.rightEyePosition withRadius:faceWidth*0.1];
        }
        //嘴巴
        if (faceFeature.hasMouthPosition) {
             [self drawCycleAtpoint:faceFeature.mouthPosition withRadius:faceWidth*0.2];
        }
    }

     //获得所有在原图中圈出来脸之后最后的图片,此时的图片是反方向的
    UIImage *tempImage = UIGraphicsGetImageFromCurrentImageContext();
   
    //将画布清空,并把放方向的图片用CG的方式画到原图中去(CG画出来的东西都是原来的反方向,并不是个好方法,实际开发中用别的方法)
    CGContextClearRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height));
    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), tempImage.CGImage);
   
    //获得重画之后的图片,并结束画布
    tempImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
   
    //将最终的图片放到View中去
    [self.imageView setImage:tempImage];
}

- (void)drawCycleAtPoint:(CGPoint)point withRadius:(CGFloat)radius {
    /*画圆*/
    //边框圆
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),1,0,0,1.0);//画笔线的颜色
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1.0);//线的宽度
    //void CGContextAddArc(CGContextRef c,CGFloat x, CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle, int clockwise)1弧度=180°/π (≈57.3°) 度=弧度×180°/π 360°=360×π/180 =2π 弧度
    // x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
    CGContextAddArc(UIGraphicsGetCurrentContext(), point.x, point.y, radius, 0, 2*M_PI, 0); //添加一个圆
    CGContextDrawPath(UIGraphicsGetCurrentContext(), kCGPathStroke); //绘制路径
}

你可能感兴趣的:(系统人脸识别:iOS 官方人脸检测Demo)