zoukankan      html  css  js  c++  java
  • iOS--iOS7摄像头识别二维码功能

    iOS–iOS7摄像头识别二维码功能

    属性介绍:

    AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件。

    • AVCaptureDevice 是关于相机硬件的接口。它被用于控制硬件特性,诸如镜头的位置、曝光、闪光灯等。
    • AVCaptureDeviceInput 提供来自设备的数据。
    • AVCaptureOutput 是一个抽象类,描述 capture session 的结果。以下是三种关于静态图片捕捉的具体子类:
      • AVCaptureStillImageOutput 用于捕捉静态图片
      • AVCaptureMetadataOutput 启用检测人脸和二维码
      • AVCaptureVideoOutput 为实时预览图提供原始帧
    • AVCaptureSession 管理输入与输出之间的数据流,以及在出现问题时生成运行时错误。
    • AVCaptureVideoPreviewLayer 是 CALayer 的子类,可被用于自动显示相机产生的实时图像。它还有几个工具性质的方法,可将 layer 上的坐标转化到设备上。它看起来像输出,但其实不是。另外,它拥有 session (outputs 被 session 所拥有)。

    设置属性:

    @property (nonatomic, strong) AVCaptureSession *session;
    @property (nonatomic, strong) AVCaptureDevice *device;
    @property (nonatomic, strong) AVCaptureDeviceInput *input;
    @property (nonatomic, strong) AVCaptureMetadataOutput *outPut;
    @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;

    添加摄像头方法

    /**
     *  设置摄像头代码
     */
    - (void)setupCamera{
        //设备
        _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    
        //输入绑定设备
        NSError *error;
        _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error];
        if (error) {
            return;
        }
    
        //输出
        _outPut = [[AVCaptureMetadataOutput alloc]init];
        [_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
        //session
        _session = [[AVCaptureSession alloc]init];
        [_session setSessionPreset:AVCaptureSessionPresetHigh];  //设置画面采集的质量
        if ([_session canAddInput:_input]) {
            [_session addInput:_input];
        }
        if ([_session canAddOutput:_outPut]) {
            [_session addOutput:_outPut];
        }
    
         //一定要先设置session的输出为output之后,再指定输出的元数据类型为二维码类型!
        [_outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    
        //预览图层
        _previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session];
    //    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspect;   //preview图层的属性,使视图形状为屏幕大小形状
        _previewLayer.frame = self.view.frame;//preview图层的大小
        [self.view.layer insertSublayer:_previewLayer atIndex:0]; //将图层添加到视图的图层
    
        //开始运行
        [_session startRunning];
    }
    

    注意output中设置了一个delegate,我们需要怎么这个协议,然后在下面的代码中设置
    [_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]

    协议的实现部分如下:

    #pragma mark - AVCaptureMetadataOutputObjectsDelegate
    // 在完成二维码解码时,调用
    // 如果QRCode的内容越大,转换需要的时间就越长
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    
        NSString *stringValue;
        if ([metadataObjects count] >0)
        {
            AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
            stringValue = metadataObject.stringValue;
        }
    
        NSLog(@"%@",stringValue);
        //获取扫描数据,结束编辑
        [_session stopRunning];
        [self dismissViewControllerAnimated:YES completion:nil];
    }

    二维码生成网站,测试时可使用

    http://cli.im/text?text053e86238125abe22dd1474278f5855d

  • 相关阅读:
    hdu 5269 ZYB loves Xor I && BestCoder Round #44
    Hibernate之关于多对多单向关联映射
    測试CPU支持指令集AVX,AVX2,SSE情况的代码【VS2010调试通过】
    联想教育应用使用说明(7.6版本号)——第5章 常见的问题与解答
    java.lang.ClassNotFoundException: org.springframework.web.content.ContextLoaderListener
    IETF和W3C的区别
    [ppurl]从”皮皮书屋”下载电子书的姿势
    javaEE面试重点
    HDU-1095-A+B for Input-Output Practice (VII)(多一个空格?)
    WinCC7.3 Win764位系统安装教程
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026886.html
Copyright © 2011-2022 走看看