ios二维码条码扫描问题

原创 2017年08月09日 19:42:52

ios原生AVFoudation扫描在同时支持二维码和条码扫描时,二维码总是很快得到数据,条码则有时有有时无,在坑里待了一段时间后终于找到原因,VCaptureMetadataOutput 有一个属性 rectOfInterest



rectOfInterest

就是设置元数据识别搜索的区域。

这个属性有点问题,不是普通的CGRect,四个值都需要在0~1之间。

AVCaptureVideoPreviewLayer 有个方法 

- (CGRect)metadataOutputRectOfInterestForRect:(CGRect)rectInLayerCoordinates 

可以看看这个方法的说明:



方法说明

描述就是:把一个在previewlayer坐标系中的rect 转换成 一个在metadataoutputs坐标系中的rect。

这个方法需要的rect参数是我们系统坐标系中的rect.

SO 。这就得到了我们需要的rectOfInterest。


代码:

- (BOOL)startReading {

    NSError *error;

    

    //1.初始化捕捉设备(AVCaptureDevice),类型为AVMediaTypeVideo

    AVCaptureDevice *captureDevice = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];

    

    //2.captureDevice创建输入流

    AVCaptureDeviceInput *input = [AVCaptureDeviceInputdeviceInputWithDevice:captureDeviceerror:&error];

    if (!input) {

        NSLog(@"%@", [errorlocalizedDescription]);

        returnNO;

    }

    

    //3.创建媒体数据输出流

    AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutputalloc] init];

    

    //4.实例化捕捉会话

    _captureSession = [[AVCaptureSessionalloc] init];

    

    //4.1.将输入流添加到会话

    [_captureSessionaddInput:input];

    

    [_captureSessionsetSessionPreset:AVCaptureSessionPresetHigh];

    

    //4.2.将媒体输出流添加到会话中

    [_captureSessionaddOutput:captureMetadataOutput];

    

    //5.创建串行队列,并加媒体输出流添加到队列当中

    dispatch_queue_t dispatchQueue;

    //dispatchQueue = dispatch_queue_create("myQueue", NULL);

    dispatchQueue = dispatch_get_main_queue();

    //5.1.设置代理

    [captureMetadataOutput setMetadataObjectsDelegate:selfqueue:dispatchQueue];

    

    //5.2.设置输出媒体数据类型为QRCode

    [captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code]];

    

    //6.实例化预览图层

    _videoPreviewLayer = [[AVCaptureVideoPreviewLayeralloc] initWithSession:_captureSession];

    

    //7.设置预览图层填充方式

    [_videoPreviewLayersetVideoGravity:AVLayerVideoGravityResizeAspectFill];

    

    //8.设置图层的frame

    [_videoPreviewLayersetFrame:_vPreview.layer.bounds];

    

    //9.将图层添加到预览view的图层上

    [_vPreview.layeraddSublayer:_videoPreviewLayer];

    

    //10.设置扫描范围

    captureMetadataOutput.rectOfInterest =CGRectMake(0.2f,0.2f, 0.8f,0.8f);

    

    //10.1.扫描框

    _boxView = [[UIViewalloc] initWithFrame:CGRectMake(60, [[UIScreenmainScreenbounds].size.height/2 -30 -([[UIScreenmainScreenbounds].size.width - 60 * 2)/2, [[UIScreenmainScreenbounds].size.width - 60 * 2, [[UIScreenmainScreenbounds].size.width - 60 * 2)];

    _boxView.layer.borderColor =mainColor.CGColor;

    _boxView.layer.borderWidth =1.0f;

    [_vPreviewaddSubview:_boxView];

    

    //10.2.扫描线

    _scanLayer = [[CALayeralloc] init];

    _scanLayer.frame =CGRectMake(0,0, _boxView.bounds.size.width,1);

    _scanLayer.backgroundColor = [UIColorcolorWithRed:190.0/255green:190.0/255blue:190.0/255alpha:1.0].CGColor;

    [_boxView.layeraddSublayer:_scanLayer];

    

    NSTimer *timer = [NSTimerscheduledTimerWithTimeInterval:0.2ftarget:selfselector:@selector(moveScanLayer:)userInfo:nilrepeats:YES];

    [timer fire];

    

    //放大焦距

    [captureDevice lockForConfiguration:&error];

    

    if (captureDevice.activeFormat.videoMaxZoomFactor > 2) {

        captureDevice.videoZoomFactor =2;

    }else{

        captureDevice.videoZoomFactor = captureDevice.activeFormat.videoMaxZoomFactor;

    }

    [captureDevice unlockForConfiguration];

    

    //10.开始扫描

    [_captureSessionstartRunning];

    

    //11.必须在startRunning之后才会生效(坑哦)

    CGRect rect =CGRectMake(30,100, self.view.frame.size.width - 60, 300);

    CGRect intertRect = [_videoPreviewLayermetadataOutputRectOfInterestForRect:rect];

    CGRect layerRect = [_videoPreviewLayerrectForMetadataOutputRectOfInterest:intertRect];

    

    NSLog(@"%@,  %@",NSStringFromCGRect(intertRect),NSStringFromCGRect(layerRect));

    

    captureMetadataOutput.rectOfInterest = intertRect;

    

//    这种方法实际不可行

//    float width = self.view.frame.size.width;// AVCaptureVideoPreviewLayer的对象的宽度

//    float height = self.view.frame.size.height;// AVCaptureVideoPreviewLayer的对象的高度

//    

//    captureMetadataOutput.rectOfInterest=CGRectMake(100/height, (width/2 -110)/width +50, 220/height, 220/width);

    

    returnYES;

}


第11步就是解决方法,指定新的rectOfInterest给captureMetadataOutput,之后扫条码和二维码就都可以啦




版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS - 二维码、条码扫描

iOS7.0后AVFoundation框架提供的原生二维码、条码扫描。#import "ViewController.h" @interface ViewController ()@property ...
  • jeikerxiao
  • jeikerxiao
  • 2016年11月10日 10:10
  • 216

[iOS 原生代码实现扫描二维码/条形码] AVCaptureDevice

//参照别人的教程的作业贴记录一下注意点扫码的主要原生代码如下这里比较关键的是对扫码作用范围的确定,metdataOutput.rectOfInterest 如果不设置,那么默认就是全屏都是作用域.如...
  • iOSTianNan
  • iOSTianNan
  • 2017年06月08日 14:36
  • 1195

iOS 二维码、条码扫描(带UI)

下面代码中待解决的问题:扫码过程中被打断(如按Home键),扫描动画会停止,需要做相应处理,在恢复前台时恢复动画。摄像头扫码使用iOS原生框架,从图片导入识别二维码使用ZXingObjC框架 /...
  • pilgrim1385
  • pilgrim1385
  • 2016年06月15日 13:38
  • 897

树莓派SimpleCV识别二维码和条形码

近期准备接下来的项目,项目要用到二维码识别,故对此提前进行了相关的研究。 步骤如下: A:安装一大堆软件,按着顺序一步一步来就行了 一、安装SimpleCV,参阅http://www.eefocus....
  • Lingdongtianxia
  • Lingdongtianxia
  • 2016年10月27日 21:59
  • 2514

使用苹果原生API进行二维码和条形码的扫描

最近需要用到二维码的扫描,发现苹果有自己的原生的api,这里简单介绍一下. 首先需要引入AVFoundation.framework 库 在相应的viewController里边引入头文件. #i...
  • Liu_Esther
  • Liu_Esther
  • 2016年04月05日 11:26
  • 1249

phonegap(cordova) 入门 6----iOS 扫码插件,好用,方便,效率高,漂亮,兼容二维码,条形码

感谢开源 https://github.com/MxABC/LBXScan 二维码、扫码、扫一扫、ZXing和ios系统自带扫码封装,扫码界面效果封装...
  • zlj002
  • zlj002
  • 2015年12月15日 09:05
  • 2656

iOS 条码及二维码扫描(从相册中读取条形码/二维码) 以及扫码遇到的问题

文章重点介绍如何解决,从手机相册中读取条形码和二维码的问题 1.扫码. 网上有特别的关于iOS扫码的代码和示例,其中扫码主要使用的是自带的AVFoundation类.这里就不细说了,要注意的是如何...
  • gaomingyangc
  • gaomingyangc
  • 2017年01月04日 13:09
  • 2747

Android应用开发之扫描二维码和条码的SDK及API

Android应用开发之扫描二维码和条码的SDK及API
  • qq_28356925
  • qq_28356925
  • 2015年12月11日 11:17
  • 659

iOS 原生二维码扫描(可限制扫描区域)

写这篇文章的主要原因不是展示如何使用 AVFoundation   来进行二维码扫描,更主要的是限制扫描二维码的范围。(因为默认的是全屏扫描) 项目遇到扫描二维码的功能需求,这里我放弃了使用三方库,而...
  • u012884714
  • u012884714
  • 2014年11月27日 18:24
  • 16882

[Phonegap+Sencha Touch] 移动开发49 BarcodeScanner(条码/二维码)插件,美化扫码界面

插件github地址: https://github.com/wildabeast/BarcodeScanner 修改方法是参考的下面的博客,里面大部分原理和修改方法都有: Android开源之行...
  • lovelyelfpop
  • lovelyelfpop
  • 2015年05月04日 21:36
  • 3504
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios二维码条码扫描问题
举报原因:
原因补充:

(最多只允许输入30个字)