美文网首页
AVFoundation 人脸和二维码识别

AVFoundation 人脸和二维码识别

作者: 韩微 | 来源:发表于2019-11-12 16:20 被阅读0次

    人脸识别的库

    1、CoreImage
    2、face++
    3、OpenCV
    4、libefacedetection
    5、AV Foundation
    6、vision

    利用AVFoundation的人脸识别

    1.视频采集
    2.为session添加一个元数据输出.AVCaptureMetadataOutput
    3.设置元数据的范围(人脸数据、二维码、一维码、、、)
    4.开始捕捉(设置捕捉完成代理).didOutputMetadataObjects
    5.获取捕捉到的人脸信息.代理方法中获取.didOutputMetadataObjects
    6.对人脸数据进行处理

    - (BOOL)setupSessionOutputs:(NSError **)error {
    
        self.metadataOutput = [[AVCaptureMetadataOutput alloc]init];
            
        //为捕捉会话添加设备
        if ([self.captureSession canAddOutput:self.metadataOutput]){
            [self.captureSession addOutput:self.metadataOutput];
            
            //获得人脸属性
            NSArray *metadatObjectTypes = @[AVMetadataObjectTypeFace];
            
            //设置metadataObjectTypes 指定对象输出的元数据类型。
            /*
             限制检查到元数据类型集合的做法是一种优化处理方法。可以减少我们实际感兴趣的对象数量
             支持多种元数据。这里只保留对人脸元数据感兴趣
             */
            self.metadataOutput.metadataObjectTypes = metadatObjectTypes;
            
            //创建主队列: 因为人脸检测用到了硬件加速,而且许多重要的任务都在主线程中执行,所以需要为这次参数指定主队列。
            dispatch_queue_t mainQueue = dispatch_get_main_queue();
            
            //通过设置AVCaptureVideoDataOutput的代理,就能获取捕获到一帧一帧数据
            [self.metadataOutput setMetadataObjectsDelegate:self queue:mainQueue];
         
            return YES;
        }else
        {
            //报错
            if (error) {
             
            }
            return NO;
        }
    
    }
    
    //捕捉数据
    - (void)captureOutput:(AVCaptureOutput *)captureOutput
    didOutputMetadataObjects:(NSArray *)metadataObjects
           fromConnection:(AVCaptureConnection *)connection {
    
        //使用循环,打印人脸数据
        for (AVMetadataFaceObject *face in metadataObjects) {
            NSLog(@"Face detected with ID:%li",(long)face.faceID);
            NSLog(@"Face bounds:%@",NSStringFromCGRect(face.bounds));
        }
        
    }
    

    利用AVFoundation的二维码识别

    CoreImage->CIDetector也能做二维码识别, CIFiter 生成二维码
    二维码分类:
    *QR码:移动营销
    *Aztec码:登机牌
    *PDF417:商品运输

     (BOOL)setupSessionInputs:(NSError *__autoreleasing *)error {
    
        //设置相机自动对焦,这样可以在任何距离都可以进行扫描。
        BOOL success = [super setupSessionInputs:error];
        if(success)
        {
            //判断是否能自动聚焦
            if (self.activeCamera.autoFocusRangeRestrictionSupported) {
                
                //锁定设备
                if ([self.activeCamera lockForConfiguration:error]) {
                    
                    //自动聚焦
                    /*
                        iOS 7.0新增属性 允许使用范围约束来对功能进行定制。
                      因为扫描条码,距离都比较近。所以AVCaptureAutoFocusRangeRestrictionNear,
                     通过缩小距离,来提高识别成功率。
                     */
                    self.activeCamera.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear;
                    
                    //释放排他锁
                    [self.activeCamera  unlockForConfiguration];
                }
            }
        }
    
        return YES;
    }
    
    - (BOOL)setupSessionOutputs:(NSError **)error {
    
        //获取输出设备
        self.metadataOutput = [[AVCaptureMetadataOutput alloc]init];
        
        //判断是否能添加输出设备
        if ([self.captureSession canAddOutput:self.metadataOutput]) {
            
            //添加输出设备
            [self.captureSession addOutput:self.metadataOutput];
            
            dispatch_queue_t mainQueue = dispatch_get_main_queue();
            
            //设置委托代理
            [self.metadataOutput setMetadataObjectsDelegate:self queue:mainQueue];
            
            //指定扫描对是OR码 & Aztec 码 (移动营销)
            NSArray *types = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeAztecCode,AVMetadataObjectTypeDataMatrixCode,AVMetadataObjectTypePDF417Code];
            
            self.metadataOutput.metadataObjectTypes = types;
            
        }else
        {
          
            return NO;
           
        }
        
        return YES;
    }
    
    
    //委托代理回掉。处理条码
    - (void)captureOutput:(AVCaptureOutput *)captureOutput
    didOutputMetadataObjects:(NSArray *)metadataObjects
           fromConnection:(AVCaptureConnection *)connection {
        
        if (metadataObjects.count > 0) {
            
            NSLog(@"%@",metadataObjects[0]);
            
            /*
             <AVMetadataMachineReadableCodeObject: 0x17002db20, type="org.iso.QRCode", bounds={ 0.4,0.4 0.1x0.2 }>corners { 0.4,0.6 0.6,0.6 0.6,0.4 0.4,0.4 }, time 122373330766250, stringValue ""http://www.echargenet.com/portal/csService/html/app.html
             */
    
        }
        
    }
    
    

    相关文章

      网友评论

          本文标题:AVFoundation 人脸和二维码识别

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