• iOS二维码生成与识别


    在 IOS7 以前,在IOS中实现二维码和条形码扫描,有两大开源组件 ZBar 与 ZXing. 总结下各自的缺点:

    • ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 “圆角二维码” 的扫描确很困难。
    • ZXing 是 Google Code上的一个开源的条形码扫描库,是用java设计的,连Google Glass 都在使用的。但有人为了追求更高效率以及可移植性,出现了c++ port. Github上的Objectivc-C port,其实就是用OC代码封装了一下而已,而且已经停止维护。
    • AVFoundation系统原生方法(demo

    这里说下使用过程中出现的问题:

    1.关于提高识别效率设置解析范围 rectOfInterest(在zbar和zxing中就是scanCropAVFoundation是 rectOfInterest,是基于图像的大小裁剪 )

    设置方法:

    CGSize size = self.view.bounds.size;
    CGRect cropRect = CGRectMake(40, 100, 240, 240);
    CGFloat p1 = size.height/size.width;
    CGFloat p2 = 1920./1080.;  //使用了1080p的图像输出
    if (p1 < p2) {
      CGFloat fixHeight = bounds.size.width * 1920. / 1080.;
      CGFloat fixPadding = (fixHeight - size.height)/2;
      captureOutput.rectOfInterest = CGRectMake((cropRect.origin.y + fixPadding)/fixHeight,
                                                  cropRect.origin.x/size.width,
                                                  cropRect.size.height/fixHeight,
                                                  cropRect.size.width/size.width);
    } else {
        CGFloat fixWidth = bounds.size.height * 1080. / 1920.;
        CGFloat fixPadding = (fixWidth - size.width)/2;
        captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,
                                                  (cropRect.origin.x + fixPadding)/fixWidth,
                                                  cropRect.size.height/size.height,
                                                  cropRect.size.width/fixWidth);
    }
    Code 1
     1 __weak typeof(self) weakSelf = self;
     2 [[NSNotificationCenter defaultCenter]addObserverForName:AVCaptureInputPortFormatDescriptionDidChangeNotification
     3                                                  object:nil
     4                                                   queue:[NSOperationQueue mainQueue]
     5                                              usingBlock:^(NSNotification * _Nonnull note) {
     6                                                  if (weakSelf){
     7                                                      //调整扫描区域
     8                                                      AVCaptureMetadataOutput *output = weakSelf.session.outputs.firstObject;
     9                                                      output.rectOfInterest = [weakSelf.previewLayer metadataOutputRectOfInterestForRect:weakSelf.scanerView.scanAreaRect];
    10                                                  }
    11                                              }];
    Code 2

    这两种方法设置的rectOfInterest是一致的,不过第二种会导致控制台报错

    <Error>: CGAffineTransformInvert: singular matrix. 原因不明

    2.关于同时识别二维码和条形码导致条形码识别缓慢,需要对齐中心才能识别的问题。

    是在Detect Center那個點,畫一個無限延伸的米字型,然後去判斷每一條線上能否解析出條形碼所需要的0101010序列。而iOS默認的Center是 Layer 的 Center。

  • 相关阅读:
    Git在eclipse中的使用
    Git协同开发产生的版本冲突
    git&github-远程库的拉取
    【题解】p6160 [Cnoi2020]向量
    【题解】p2388 阶乘之乘
    友情链接
    O(1)求解自然数异或和
    【题解】uva1104 chips challenge
    【题解】p1809 过河问题
    多步操作产生错误,请检查每一步的状态
  • 原文地址:https://www.cnblogs.com/H7N9/p/6048232.html
Copyright © 2020-2023  润新知