美文网首页工具相关
CoreImage(三)CIDetector人脸识别和二维码扫描

CoreImage(三)CIDetector人脸识别和二维码扫描

作者: 深圳张学友 | 来源:发表于2018-02-02 15:44 被阅读292次

    CIDetector是用来分析CIImage,得到CIFeature。用来识别特定特征图片的类,主要可用来识别人脸、

    属性和方法介绍

    识别类型

    //人脸
    CORE_IMAGE_EXPORT NSString* const CIDetectorTypeFace NS_AVAILABLE(10_7, 5_0);
    //矩形
    CORE_IMAGE_EXPORT NSString* const CIDetectorTypeRectangle NS_AVAILABLE(10_10, 8_0);
    //二维码
    CORE_IMAGE_EXPORT NSString* const CIDetectorTypeQRCode NS_AVAILABLE(10_10, 8_0);
    //文本
    CORE_IMAGE_EXPORT NSString* const CIDetectorTypeText 
    

    使用方法 :

     作为type参数
    // Types to be used for +[CIDetector detectorOfType:context:options:]
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:param];
    
    

    参数设置

    不同参数具有不同识别效果,参数通过字典进行设置
    精度设置

    //key
    CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracy NS_AVAILABLE(10_7, 5_0);
    
    //value
    //精度低,速度快
    CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyLow NS_AVAILABLE(10_7, 5_0); 
    //精度高,速度慢
    CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyHigh NS_AVAILABLE(10_7, 5_0); 
    

    特征追踪

    //key 用于视频中的特征追踪 value为@YES @NO
    CORE_IMAGE_EXPORT NSString* const CIDetectorTracking NS_AVAILABLE(10_8, 6_0);
    

    特征识别尺寸

    //key  最小的特征识别尺寸 value为0.0 ~ 1.0 (NSnumber)
    CORE_IMAGE_EXPORT NSString* const CIDetectorMinFeatureSize NS_AVAILABLE(10_8, 6_0);
    
     //key  最大的特征识别尺寸 value为1 ~ 256 (NSnumber)
    CORE_IMAGE_EXPORT NSString* const CIDetectorMaxFeatureCount NS_AVAILABLE(10_12, 10_0);
    

    使用方法:

    //使用方法 作为Options参数传入
    // Options that can be used with +[CIDetector detectorOfType:context:options:]
    NSDictionary *options = @{CIDetectorAccuracy:CIDetectorAccuracyHigh};
    CIDetector * faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:options];
    

    具体特征识别

    // 角度个数 value为1,3,5,7,9,11 (NSnumber)之一
    CORE_IMAGE_EXPORT NSString* const CIDetectorNumberOfAngles NS_AVAILABLE(10_11, 9_0);
    
    // 图片方向 value为1 ~ 8(NSnumber)之一
    CORE_IMAGE_EXPORT NSString *const CIDetectorImageOrientation NS_AVAILABLE(10_8, 5_0);
    
    //识别眨眼 value为@YES,@NO
    CORE_IMAGE_EXPORT NSString *const CIDetectorEyeBlink NS_AVAILABLE(10_9, 7_0);
    
    //识别微笑 value为@YES,@NO
    CORE_IMAGE_EXPORT NSString *const CIDetectorSmile NS_AVAILABLE(10_9, 7_0);
    
    //焦距 value为float (NSNumber)
    CORE_IMAGE_EXPORT NSString* const CIDetectorFocalLength NS_AVAILABLE(10_10, 8_0);
    
    //矩形宽高比 value为float (NSNumber)
    CORE_IMAGE_EXPORT NSString* const CIDetectorAspectRatio NS_AVAILABLE(10_10, 8_0);
    
    //识别子特征 value为@YES,@NO
    CORE_IMAGE_EXPORT NSString* const CIDetectorReturnSubFeatures __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
    

    使用方法:

     //作为Options参数传入
     // Options that can be used with -[CIDetector featuresInImage:options:]
     NSDictionary *options = @{CIDetectorSmile: [NSNumber numberWithBool:true], CIDetectorEyeBlink:[NSNumber numberWithBool:true]};
     NSArray *detectResult = [faceDetector featuresInImage:cImage options:options];
    

    具体使用

    人脸识别

    可以识别多人,区分人与动物的脸,判断人脸是否在笑和眨眼,但是不能做到区分人的脸,不能做面部解锁等功能。

    CIImage *cImage = [CIImage imageWithCGImage:image.CGImage];
        
    //设置人脸识别精度
    NSDictionary *options = [NSDictionary dictionaryWithObject:
                              CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
    //创建人脸探测器
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace
                        context:nil options:options];
    //获取人脸识别
    NSArray *detectResult = [detector featuresInImage:cImage];
    UIView * resultView = [[UIView alloc] initWithFrame:_imageView.frame];
    [self.view addSubview:resultView];
    
    //分析人脸识别数据
    for (CIFaceFeature * faceFeature in detectResult) {
        UIView *faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
        faceView.layer.borderColor = [UIColor redColor].CGColor;
        faceView.layer.borderWidth = 1;
        [resultView addSubview:faceView];
       
        if (faceFeature.hasLeftEyePosition) {
            UIView * leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
            [leftEyeView setCenter:faceFeature.leftEyePosition];
            leftEyeView.layer.borderWidth = 1;
            leftEyeView.layer.borderColor = [UIColor redColor].CGColor;
            [resultView addSubview:leftEyeView];
        }
            
       if (faceFeature.hasRightEyePosition) {
           UIView * rightEyeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
           [rightEyeView setCenter:faceFeature.rightEyePosition];
           rightEyeView.layer.borderWidth = 1;
           rightEyeView.layer.borderColor = [UIColor redColor].CGColor;
           [resultView addSubview:rightEyeView];
       }
            
        if (faceFeature.hasMouthPosition) {
            UIView * mouthView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 5)];
            [mouthView setCenter:faceFeature.mouthPosition];
            mouthView.layer.borderWidth = 1;
            mouthView.layer.borderColor = [UIColor redColor].CGColor;
            [resultView addSubview:mouthView];
        }
        
            //具体特征识别
        if (faceFeature.hasSmile) {
            NSLog(@"再笑");
        }
        if (faceFeature.leftEyeClosed) {
            NSLog(@"左眼闭了");
        }
        if (faceFeature.rightEyeClosed) {
            NSLog(@"右眼闭了");
        }
    }
        
        [resultView setTransform:CGAffineTransformMakeScale(1, -1)];
    }
    
    人脸识别

    二维码识别

    CIDetector *qrCodeDetector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
    NSData *imageData = UIImagePNGRepresentation(_qrImage);
    CIImage *ciImage = [CIImage imageWithData:imageData];
    NSArray *features = [qrCodeDetector featuresInImage:ciImage];
    CIQRCodeFeature *feature = [features objectAtIndex:0];
    NSString *scannedResult = feature.messageString;
    NSLog(@"%@",scannedResult);
    
    二维码识别

    注意事项

    坐标位置
    CI坐标系是以左下角为原点的,和我们以往UIkit中左上角为原点是不一样的,所以最后的view添加这个段代码

    [resultView setTransform:CGAffineTransformMakeScale(1, -1)];
    

    有时候我们使用图片,imageview和image的图片不一样大,默认照片的图片像素很高,我们要将获取的位置进行调整。将坐标乘以以下系数。

    #define ConvertX (self.imageView.frame.size.width) / _image.size.width
    #define ConvertY (self.imageView.frame.size.height) / _image.size.height
    

    我们也可以在一开始进行特征识别时,将图片缩放至imageview的大小(但是图片识别能力会下降)

    float xfactor = self.imageView.bounds.size.width/image.size.width;
    float yfactor = self.imageView.bounds.size.height/image.size.height;
    cImage = [cImage imageByApplyingTransform:CGAffineTransformMakeScale(xfactor, yfactor)];
    

    使用方法
    设置精度的方法和设置具体特征方法不要写在同一个字典中,两个设置的方法是不一样的

     //设置高精度人脸识别器
    NSDictionary *param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:param];
    
    //设置微笑和闭眼识别器
    NSDictionary *options = @{CIDetectorSmile: [NSNumber numberWithBool:true], CIDetectorEyeBlink:[NSNumber numberWithBool:true]};
    NSArray *detectResult = [faceDetector featuresInImage:cImage options:options];
    

    Demo

    Demo地址:人脸识别和二维码扫描

    相关文章

      网友评论

        本文标题:CoreImage(三)CIDetector人脸识别和二维码扫描

        本文链接:https://www.haomeiwen.com/subject/uerezxtx.html