zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    用OLEDB读取EXCEL时,单元格内容长度超过255被截断
    jquery对属性和特性的操作
    yum报[Errno 256] No more mirrors to try
    c语言:计算数组长度
    递归之100.相同的树
    1160.Find Words That Can Be Formed By Characters
    892.surface area of 3D shapes
    递归之24&206(链表)
    C++ private
    Dell 7559 安装黑苹果 Mojave14.15.6
  • 原文地址:https://www.cnblogs.com/H7N9/p/6048232.html
Copyright © 2011-2022 走看看