系统二维码扫描 扫描框设置 rectOfInterest

本文介绍了一种在iOS应用中实现QR码扫描的方法,通过使用AVFoundation框架搭建摄像头捕获系统,并结合CIDetector进行图像识别,实现了对QR码的有效读取。文中详细介绍了如何配置AVCaptureSession、设置扫描区域及响应二维码数据。
摘要由CSDN通过智能技术生成

 

#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

 

@interface ViewController ()<WJScanningViewdelegate,AVCaptureMetadataOutputObjectsDelegate>

 

@property (nonatomic, strong) CIDetector *detecter;

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

    

    AVCaptureSession *session = [[AVCaptureSession alloc] init];

    [session addInput:input];

    [session addOutput:output];

    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    [output setRectOfInterest:CGRectMake(100/self.view.frame.size.height, 50/self.view.frame.size.width, 300/self.view.frame.size.height, 400/self.view.frame.size.width)];

    

    AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    [layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    [layer setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

    [self.view.layer addSublayer:layer];

    [session startRunning];

    

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];

    view.backgroundColor = [UIColor clearColor];

    view.layer.borderWidth = 1;

    view.layer.borderColor = [UIColor redColor].CGColor;

    [self.view addSubview:view];

 

    //调整扫描区域   ,有些资料说设置 rectOfInterest  

   //CGRectMake(y/deviceHeight, x/deviceWidth, height/deviceHeight, width/deviceWidth);

解释下CGRectMake写法:都把x y width height 互换 了的.你扫一扫的那个框框的  起点坐标为 x  y 宽为width 高为height  ,deviceHeight ,deviceWidth指的是AVCaptureVideoPreviewLayer对象的高度,个人按这个方法弄但是有很多问题,效果不是很好。  

//个人觉得还是下面比较容易接受,与以往设置frame一样。

  __weak typeof(self) weakSelf = self;

    [[NSNotificationCenter defaultCenter]addObserverForName:AVCaptureInputPortFormatDescriptionDidChangeNotification object:nil queue:[NSOperationQueue mainQueue]

    usingBlock:^(NSNotification * _Nonnull note) {

    if (weakSelf){

    AVCaptureMetadataOutput *output = session.outputs.firstObject;

    output.rectOfInterest = [layer metadataOutputRectOfInterestForRect:CGRectMake(50, 100, 200, 200)];

    }

        

    }];

    

}

 

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {

    

    //判断是否有数据

    if (metadataObjects != nil && [metadataObjects count] > 0) {

        AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];

        NSLog(@"=========%@",metadataObj.stringValue);

        //判断回传的数据类型

        if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {

    

        }

    }

}

 

转载于:https://www.cnblogs.com/wujie123/p/6782129.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值