IOS开发入门之CIDetector之CIDetectorTypeFace人脸识别
白羽 2018-09-07 来源 :网络 阅读 1166 评论 0

摘要:本文将带你了解IOS开发入门之CIDetector之CIDetectorTypeFace人脸识别,希望本文对大家学IOS有所帮助。

        本文将带你了解IOS开发入门之CIDetector之CIDetectorTypeFace人脸识别,希望本文对大家学IOS有所帮助。


   
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    imageView.image = [UIImage imageNamed:@"timg.jpeg"];
    [self.view addSubview:imageView];
    
    CGFloat width = imageView.image.size.width;
    CGFloat height = imageView.image.size.height;
    
    CGFloat sWidth = imageView.bounds.size.width;
    CGFloat sHeight = imageView.bounds.size.height;
    
    CGFloat x = width/sWidth;
    CGFloat y = height/sHeight;
    
    // 根据image修改imageview的frame
    if (x > y)
    {
        imageView.frame = CGRectMake(0, (sHeight-height/x)/2, sWidth, height/x);
    }else{
        imageView.frame = CGRectMake((sWidth-width/y)/2, 0, width/y, sHeight);
    }
    
    // 压缩image
    UIGraphicsBeginImageContext(CGSizeMake(imageView.bounds.size.width , imageView.bounds.size.height));
    [imageView.image drawInRect:CGRectMake(0, 0, imageView.bounds.size.width, imageView.bounds.size.height)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    imageView.image = scaledImage;
    
    //识别
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        CIImage *cImage = [CIImage imageWithCGImage:imageView.image.CGImage];
        // 设置识别模式
        NSDictionary  *opts = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh
                                                          forKey:CIDetectorAccuracy];
        /* Lower accuracy, higher performance */
        //CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyLow NS_AVAILABLE(10_7, 5_0);
        
        /* Lower performance, higher accuracy */
        //CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyHigh NS_AVAILABLE(10_7, 5_0);
        
        CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace
                                                  context:nil
                                                  options:opts];
        
        NSArray *features = [detector featuresInImage:cImage];
        
        if ([features count] == 0)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"检测失败");
            });
            return ;
        }
        
        for (CIFaceFeature *feature in features)
        {
            // 是否微笑
            BOOL smile = feature.hasSmile;
            
            NSLog(smile ? @"微笑" : @"没微笑");
            
            // 眼睛是否睁开
            BOOL leftEyeClosed = feature.leftEyeClosed;
            BOOL rightEyeClosed = feature.rightEyeClosed;
            
            NSLog(leftEyeClosed ? @"左眼没睁开" : @"左眼睁开");
            NSLog(rightEyeClosed ? @"右眼没睁开" : @"右眼睁开");
            
            // 获取脸部frame
            CGRect rect = feature.bounds;
            rect.origin.y = imageView.bounds.size.height - rect.size.height - rect.origin.y;// Y轴旋转180度
            faceRect = rect;
            NSLog(@"脸 %@",NSStringFromCGRect(rect));
            
            // 左眼
            if (feature.hasLeftEyePosition)
            {
                CGPoint eye = feature.leftEyePosition;
                eye.y = imageView.bounds.size.height - eye.y;// Y轴旋转180度
                NSLog(@"左眼 %@",NSStringFromCGPoint(eye));
            }
            
            // 右眼
            if (feature.hasRightEyePosition)
            {
                CGPoint eye = feature.rightEyePosition;
                eye.y = imageView.bounds.size.height - eye.y;// Y轴旋转180度
                NSLog(@"右眼 %@",NSStringFromCGPoint(eye));
            }
            
            // 嘴
            if (feature.hasMouthPosition)
            {
                CGPoint mouth = feature.mouthPosition;
                mouth.y = imageView.bounds.size.height - mouth.y;// Y轴旋转180度
                NSLog(@"嘴 %@",NSStringFromCGPoint(mouth));
            }
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"检测完成");
            UIView *view = [[UIView alloc] initWithFrame:faceRect];
            view.backgroundColor = [UIColor blueColor];
            view.alpha = 0.3;
            [imageView addSubview:view];
        });
    });
}

关于图片压缩:imageview的大小与image的大小不一致,识别的时候,是按照image的大小进行计算,通过重绘,使imageview与image保持一致。
关于坐标Y轴翻转:屏幕的坐标原点即(0,0)点在左上角,识别图片的坐标原点在左下角。
运行结果

控制台输出结果







   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved