精华内容
下载资源
问答
  • 二维码扫码识别应用
    千次阅读
    2021-11-29 11:38:36

    混口饭
    我寻寻觅觅,寻寻觅觅一个可以二次开发的扫码枪。然而,店小二总是告诉我:“这个……额……额……俺也不知道呢……”。本文将一步一步实现在网页项目中集成扫码枪设备。

    1.项目背景

    我们的项目是一个B/S架构的仓储管理系统,物品入库时生成唯一二维码并粘贴,用户在系统内扫描二维进行物品识别并选择操作。
    项目前期对于二维码的识别方法是调用本地摄像头,使用 QRCode.js 进行二维码识别,在扫码成功回调中进行业务操作。随着实际地实施和应用,这种方法的弊端渐渐显现:

    • 摄像头设备要求高:成本昂贵(差点换成高拍仪)
    • 摄像头焦点问题:识别过程需要移动物品适应摄像头焦点,过程繁琐,耗费体力
    • 安全问题:如果应用场景有安全规定,那么摄像头设备显然是不可以存在的

    基于出现的种种情况,要求我们必须对扫码方式做出改变,扫码枪是最合适的选择。
    某宝上只花了46元就买到了支持条码+二维码的扫码枪。

    2.扫码枪工作原理

    扫码枪在本质上可以理解为一种 特殊键盘 ,通过光学元器件获取条码或二维码进行识别,然后将识别结果(文本)逐字转化为键盘输入信号发送。
    扫码枪工作原理

    3.扫码枪接入项目

    在js中接入扫码枪,其实还是挺简单的,处理的流程图如下:
    程序流程图

    代码如下

    <script>
            var qrResult = "";
            $(document).keydown(function(event){
              if( event.key=="Enter" ){
                  readResult = qrResult;
                  qrResult = "";
                  if(readResult!=undefined || readResult!=""){
                      // 业务流程
                  }
              }else {
                  qrResult = qrResult + event.key;
              }
            });
    </script>
    

    4.可能遇到的问题

    1. 窗口焦点问题
      当在当前页面加载完成后,如果用户并未在此页面有任何操作,由于当前焦点并不在此窗口,所以此时扫码枪的输入信号并不会被监听,业务流程也无法被正常执行。解决办法为:增加必要的提示和页面交互操作,比如在本页面做出提示,要求用户在本页面至少进行一次点击或其他交互后方能使用扫码枪。
    2. 输入法中文模式问题
      本文实现的处理流程并不是直接录入型的,当用户在页面有一个文本输入控件(如:input、textaera等)时,如果当前输入法处于中文输入模式时,扫码枪的回传信息将等同于键盘逐字点击操作。
      举个例子:
      识别结果为:id=1,当输入法为中文时,最终通过扫码枪输入到输入控件的结果很可能是如 “i的” 的输入法软件处理后的结果。下图展示了我本地的模拟结果。解决办法为:根据实际情况在开发中指定输入控件的输入类型和输入范围。
      模拟错误输入
    更多相关内容
  • 普通HTML页面web识别条形二维码,亲自测试可以使用。
  • 1,QQ扫码界面2,支付宝扫码界面3,微信扫码界面 其他设置参数自定义效果 可以在扫描框周围设置背景色 扫描码框颜色也可以设置 扫描码盒可以设置4个角的颜色,可以设置大小 只能设置为识别图像区域中的扫描代码框 ...
  • 霍尼韦尔Honeywell1400G 回车后缀的添加删除,还有其他常用操作,包括说明书和彩页
  • 主要介绍了超简单Android集成华为HMS Scankit 扫码SDK实现扫一扫二维码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 扫码的过程中,大家可能会有疑问:这二维码安全吗?会不会泄漏我的个人信息?更深度的用户还会考虑:我的系统是不是也可以搞一个二维码来推广呢? 这时候就需要了解一下二维码背后的技术和逻辑了!

    今日分享开始啦,请大家多多指教~

    在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二维码,防止上当受骗。

    二维码,大家再熟悉不过了:购物扫个码,吃饭扫个码,坐公交也扫个码。

    在扫码的过程中,大家可能会有疑问:这二维码安全吗?会不会泄漏我的个人信息?更深度的用户还会考虑:我的系统是不是也可以搞一个二维码来推广呢?

    这时候就需要了解一下二维码背后的技术和逻辑了!

    二维码最常用的场景之一就是通过手机端应用扫描PC或者WEB端的二维码,来登录同一个系统。比如手机微信扫码登录PC端微信,手机淘宝扫码登录PC端淘宝。那么就让我们来看一下,二维码登录是怎么操作的!

    二维码登录的本质

    二维码登录本质上也是一种登录认证方式。既然是登录认证,要做的也就两件事情!

    • 告诉系统我是谁
    • 向系统证明我是谁

    比如账号密码登录,账号就是告诉系统我是谁, 密码就是向系统证明我是谁; 比如手机验证码登录,手机号就是告诉系统我是谁,验证码就是向系统证明我是谁;

    那么扫码登录是怎么做到这两件事情的呢?我们一起来考虑一下

    手机端应用扫PC端二维码,手机端确认后,账号就在PC端登录成功了!这里,PC端登录的账号肯定与手机端是同一个账号。不可能手机端登录的是账号A,而扫码登录以后,PC端登录的是账号B。

    所以,第一件事情,告诉系统我是谁,是比较清楚的!

    通过扫描二维码,把手机端的账号信息传递到PC端,至于是怎么传的,我们后面再说

    第二件事情,向系统证明我是谁。扫码登录过程中,用户并没有去输入密码,也没有输入验证码,或者其他什么码。那是怎么证明的呢?

    有些同学会想到,是不是扫码过程中,把密码传到了PC端呢?但这是不可能的。因为那样太不安全的,客户端也根本不会去存储密码。我们仔细想一下,其实手机端APP它是已经登录过的,就是说手机端是已经通过登录认证。所说只要扫码确认是这个手机且是这个账号操作的,其实就能间接证明我谁。

    认识二维码

    那么如何做确认呢?我们后面会详细说明,在这之前我们需要先认识一下二维码!在认识二维码之前我们先看一下一维码!在这里插入图片描述
    所谓一维码,也就是条形码,超市里的条形码–这个相信大家都非常熟悉,条形码实际上就是一串数字,它上面存储了商品的序列号。

    二维码其实与条形码类似,只不过它存储的不一定是数字,还可以是任何的字符串,你可以认为,它就是字符串的另外一种表现形式,
    在搜索引擎中搜索二维码,你可以找到很多在线生成二维码的工具网站,这些网站可以提供字符串与二维码之间相互转换的功能。在这里插入图片描述
    在左边的输入框就可以输入你的内容,它可以是文本、网址,文件………。然后就可以生成代表它们的二维码

    你也可以把二维码上传,进行”解码“,然后就可以解析出二维码代表的含义

    系统认证机制

    认识了二维码,我们了解一下移动互联网下的系统认证机制。

    前面我们说过,为了安全,手机端它是不会存储你的登录密码的。但是在日常使用过程中,我们应该会注意到,只有在你的应用下载下来后,第一次登录的时候,才需要进行一个账号密码的登录, 那之后呢 即使这个应用进程被杀掉,或者手机重启,都是不需要再次输入账号密码的,它可以自动登录。

    其实这背后就是一套基于token的认证机制,我们来看一下这套机制是怎么运行的。在这里插入图片描述

    • 账号密码登录时,客户端会将设备信息一起传递给服务端
    • 如果账号密码校验通过,服务端会把账号与设备进行一个绑定,存在一个数据结构中,这个数据结构中包含了账号ID,设备ID,设备类型等等
    const token = {
      acountid:'账号ID',
      deviceid:'登录的设备ID',
      deviceType:'设备类型,如 iso,android,pc......',
    }
    

    然后服务端会生成一个token,用它来映射数据结构,这个token其实就是一串有着特殊意义的字符串,它的意义就在于,通过它可以找到对应的账号与设备信息。

    • 客户端得到这个token后,需要进行一个本地保存,每次访问系统API都携带上token与设备信息。
    • 服务端就可以通过token找到与它绑定的账号与设备信息,然后把绑定的设备信息与客户端每次传来的设备信息进行比较,
      如果相同,那么校验通过,返回AP接口响应数据, 如果不同,那就是校验不通过拒绝访问。

    从前面这个流程,我们可以看到,客户端不会也没必要保存你的密码,相反,它是保存了token。可能有些同学会想,这个token这么重要,万一被别人知道了怎么办。实际上,知道了也没有影响, 因为设备信息是唯一的,只要你的设备信息别人不知道, 别人拿其他设备来访问,验证也是不通过的。

    可以说,客户端登录的目的,就是获得属于自己的token。

    那么在扫码登录过程中,PC端是怎么获得属于自己的token呢?不可能手机端直接把自己的token给PC端用!token只能属于某个客户端私有,其他人或者是其他客户端是用不了的。在分析这个问题之前,我们有必要先梳理一下,扫描二维码登录的一般步骤是什么样的。这可以帮助我们梳理清楚整个过程。

    扫描二维码登录的一般步骤

    大概步骤在这里插入图片描述

    • 扫码前,手机端应用是已登录状态,PC端显示一个二维码,等待扫描
    • 手机端打开应用,扫描PC端的二维码,扫描后,会提示"已扫描,请在手机端点击确认"
    • 用户在手机端点击确认,确认后PC端登录就成功了

    可以看到,二维码在中间有三个状态, 待扫描,已扫描待确认,已确认。那么可以想象在这里插入图片描述

    • 二维码的背后它一定存在一个唯一性的ID,当二维码生成时,这个ID也一起生成,并且绑定了PC端的设备信息
    • 手机去扫描这个二维码
    • 二维码切换为 已扫描待确认状态, 此时就会将账号信息与这个ID绑定
    • 当手机端确认登录时,它就会生成PC端用于登录的token,并返回给PC端

    好了,到这里,基本思路就已经清晰了,接下来我们把整个过程再具体化一下

    二维码准备

    按二维码不同状态来看, 首先是等待扫描状态,用户打开PC端,切换到二维码登录界面时。在这里插入图片描述

    • PC端向服务端发起请求,告诉服务端,我要生成用户登录的二维码,并且把PC端设备信息也传递给服务端
    • 服务端收到请求后,它生成二维码ID,并将二维码ID与PC端设备信息进行绑定
    • 然后把二维码ID返回给PC端
    • PC端收到二维码ID后,生成二维码(二维码中肯定包含了ID)
    • 为了及时知道二维码的状态,客户端在展现二维码后,PC端不断的轮询服务端,比如每隔一秒就轮询一次,请求服务端告诉当前二维码的状态及相关信息

    二维码已经准好了,接下来就是扫描状态

    扫描状态切换在这里插入图片描述

    • 用户用手机去扫描PC端的二维码,通过二维码内容取到其中的二维码ID
    • 再调用服务端API将移动端的身份信息与二维码ID一起发送给服务端
    • 服务端接收到后,它可以将身份信息与二维码ID进行绑定,生成临时token。然后返回给手机端
    • 因为PC端一直在轮询二维码状态,所以这时候二维码状态发生了改变,它就可以在界面上把二维码状态更新为已扫描

    那么为什么需要返回给手机端一个临时token呢?临时token与token一样,它也是一种身份凭证,不同的地方在于它只能用一次,用过就失效。

    在第三步骤中返回临时token,为的就是手机端在下一步操作时,可以用它作为凭证。以此确保扫码,登录两步操作是同一部手机端发出的。

    状态确认

    最后就是状态的确认了。在这里插入图片描述

    • 手机端在接收到临时token后会弹出确认登录界面,用户点击确认时,手机端携带临时token用来调用服务端的接口,告诉服务端,我已经确认
    • 服务端收到确认后,根据二维码ID绑定的设备信息与账号信息,生成用户PC端登录的token
    • 这时候PC端的轮询接口,它就可以得知二维码的状态已经变成了"已确认"。并且从服务端可以获取到用户登录的token
    • 到这里,登录就成功了,后端PC端就可以用token去访问服务端的资源了

    扫码动作的基础流程都讲完了,有些细节还没有深入介绍,

    比如二维码的内容是什么?

    • 可以是二维码ID
    • 可以是包含二维码ID的一个url地址

    在扫码确认这一步,用户取消了怎么处理?这些细节都留给大家思考

    总结在这里插入图片描述
    我们从登陆的本质触发,探索二维码扫码登录是如何做到的

    • 告诉系统我是谁
    • 向系统证明我谁

    在这个过程中,我们先简单讲了两个前提知识,

    • 一个是二维码原理
    • 一个是基于token的认证机制

    然后我们以二维码状态为轴,分析了这背后的逻辑: 通过token认证机制与二维码状态变化来实现扫码登录。

    需要指出的是,前面的讲的登录流程,它适用于同一个系统的PC端,WEB端,移动端。

    今日份分享已结束,请大家多多包涵和指点!

    展开全文
  • 因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能。 我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好) 现在将调用摄像头+识别二维码这两个...

    因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能。

    我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好)

    现在将调用摄像头+识别二维码这两个功能单独出来写到这里,供大家讨论和参考。

    有什么不足或者问题大家可以提出来,共同改进共同进步

    创建一个空的winform项目解决方案,我起名叫他:ScanQRCode

    将Form1作为主窗体,设置相关属性:

    StartPosition:CenterScreen (窗体居中)

    添加一个居中标题:

    private void LoadTitleCenterData()
     {
          string titleMsg ="二维码识别主界面";
          Graphics g = this.CreateGraphics();
          Double startingPoint = (this.Width / 2) - (g.MeasureString(titleMsg, this.Font).Width / 2);
          Double widthOfASpace = g.MeasureString(" ", this.Font).Width;
          String tmp = " ";
          Double tmpWidth = 0;
     
          while ((tmpWidth + widthOfASpace) < startingPoint)
          {
            tmp += " ";
            tmpWidth += widthOfASpace;
          }
          this.Text = tmp + titleMsg;
     }
    

    最大最小化禁用:

    public Form1()
    {
      this.MinimizeBox = false;
      this.MaximizeBox = false;
      InitializeComponent();
      LoadTitleCenterData();
    }
    

    Form1中添加一个TableLayoutPanel,三行三列,比例按照百分比:10%,80%,10%这样

    在TableLayoutPanel的80%中再添加一个TableLayoutPanel,还是行比例:20%,80%这样(二八定律)

    在TableLayoutPanel中添加Panel,在其中手动在添加几个按钮和label

    最终界面这样(能看就行):

    在这里插入图片描述

    添加一个二维码识别界面CameraQR:

    使用Nuget添加引用,搜索AForge,将如下程序包引入:
    在这里插入图片描述

    添加一个识别二维码的窗体,命名名称为:CameraQR

    将VideoSourcePlayer添加到窗体中,Fill显示:

    窗体中定义几个私有变量:

    1
    2
    3
    private AForge.Video.DirectShow.FilterInfoCollection _videoDevices;//摄像设备
    System.Timers.Timer timer;//定时器
    CameraHelper _cameraHelper = new CameraHelper();//视屏设备操作类
    窗体Load事件中获取拍照设备列表,并将第一个设备作为摄像设备(如有前后两个或多个摄像头,自己去改一下代码,设置成可以选择的,在CameraHelper中的CreateFilterInfoCollection()中):

    private void CameraQR_Load(object sender, EventArgs e)
    {
          // 获取视频输入设备
          _videoDevices = _cameraHelper.CreateFilterInfoCollection();//获取拍照设备列表
          if (_videoDevices.Count == 0)
          {
            MessageBox.Show("无设备");
            this.Dispose();
            this.Close();
            return;
          }
          resultStr = "";//二维码识别字符串清空
          _cameraHelper.ConnectDevice(videoSourcePlayer1);//连接打开设备
    }
    

    组件初始化完成之后,添加一个定时任务,用来阶段性识别摄像设备中的图片资源,我写的是每200毫秒去识别一次,如果c#教程图片中有二维码,就识别二维码;识别成功之后,关闭窗体,将识别结果返回给上一个界面,此处需要一个有识别二维码程序包

    使用Nuget添加引用,搜索ZXing,将如下程序包引入:

    在这里插入图片描述

    代码如下(核心代码基本就这些):

    public CameraQR()
    {
      this.MinimizeBox = false;
      this.MaximizeBox = false;
      InitializeComponent();
      LoadTitleCenterData();
      CheckForIllegalCrossThreadCalls = false;//多线程中访问窗体控件资源不会异常
      AddTimer();//定时识别图片
    }
     
    private void AddTimer()
    {
     timer = new System.Timers.Timer();
     timer.Enabled = true;
     timer.Interval = 200;
     timer.Start();
     timer.Elapsed += new ElapsedEventHandler(PicToQRCode);
    }
    private void PicToQRCode(object sender, ElapsedEventArgs e)
    {
          if (_cameraHelper.img == null)
            return;
          BinaryBitmap bitmap = null;
          try
          {
            MemoryStream ms = new MemoryStream();
            _cameraHelper.img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            byte[] bt = ms.GetBuffer();
            ms.Close();
            LuminanceSource source = new RGBLuminanceSource(bt, _cameraHelper.img.Width, _cameraHelper.img.Height);
            bitmap = new BinaryBitmap(new ZXing.Common.HybridBinarizer(source));
          }
          catch (Exception ex)
          {
            return;
          }
     
          Result result=null;
          try
          {
            //开始解码
            result = new MultiFormatReader().decode(bitmap);
          }
          catch (ReaderException ex)
          {
            resultStr = ex.ToString();
          }
          if (result != null)
          {
            resultStr = result.Text;
            this.DialogResult = DialogResult.OK;
            this.Close();
          }}
    

    窗体关闭时,记得释放定时器 关闭摄像头(不然异常满天飞):

    private void CameraQR_FormClosing(object sender, FormClosingEventArgs e)
    {
       if (timer != null)
       {
         timer.Dispose();
       }
        _cameraHelper.CloseDevice();
     }
    

    CameraHelper类:

    public class CameraHelper
    {
      public FilterInfoCollection _videoDevices;//本机摄像硬件设备列表
      public VideoSourcePlayer _videoSourcePlayer;//视频画布
      public Bitmap img = null;//全局变量,保存每一次捕获的图像
      public System.Drawing.Image CaptureImage(VideoSourcePlayer sourcePlayer = null)
      {
     
        if (sourcePlayer == null || sourcePlayer.VideoSource == null)
        {
          if (_videoSourcePlayer == null)
            return null;
          else
          {
            sourcePlayer = _videoSourcePlayer;
          }
        }
     
        try
        {
          if (sourcePlayer.IsRunning)
          {
            System.Drawing.Image bitmap = sourcePlayer.GetCurrentVideoFrame();
            return bitmap;
          }
          return null;
     
        }
        catch (Exception ex)
        {
          return null;
        }
      }
     
      public FilterInfoCollection CreateFilterInfoCollection()
      {
        if (_videoDevices != null)
          return _videoDevices;
        _videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        return _videoDevices;
      }
     
      public VideoCaptureDevice ConnectDevice(VideoSourcePlayer videoSourcePlayer, FilterInfo filterInfo = null)
      {
        VideoCaptureDevice videoSource = new VideoCaptureDevice();
        if (filterInfo == null)
        {
          videoSource = new VideoCaptureDevice(_videoDevices[_videoDevices.Count - 1].MonikerString);
        }
        else
        {
          videoSource = new VideoCaptureDevice(filterInfo.MonikerString);
        }
     
        videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
        videoSourcePlayer.VideoSource = videoSource;
        videoSourcePlayer.Start();
        _videoSourcePlayer = videoSourcePlayer;
        return videoSource;
      }
     
      private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
      {
        img = (Bitmap)eventArgs.Frame.Clone();
      }
     
      public void CloseDevice(VideoSourcePlayer videoSourcePlayer = null)
      {
        if (videoSourcePlayer == null)
        {
          if (_videoSourcePlayer == null)
            return;
          _videoSourcePlayer.SignalToStop();
        }
        else
        {
          videoSourcePlayer.SignalToStop();
        }
      }
    }
    

    我用的测试二维码是:

    在这里插入图片描述

    最终的别结果为:

    在这里插入图片描述

    代码:https://github.com/Binzm/ScanQRCode.git

    以上就是winform 调用摄像头扫码识别二维码的实现步骤的详细内容

    展开全文
  • 源自支付宝的扫码组件,全新升级,免费开放!让天下没有难认的“码”

    二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

    设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息。

    一、背景

    随着支付宝的线下场景不断扩大,收钱码、口碑、共享单车、充电宝、停车缴费等产品让我们的生活越来越便利。二维码因为成本低、兼容性好成为了线上线上最主要的连接工具,也因此面临更多新的挑战。因为二维码是一种点阵式信息编码方式,任何视觉上的缺损、弯曲以及光线作用都会极大的影响识别成功率,如果识别困难也就意味着用户可能选择放弃,影响支付体验也影响用户心智。

    用户扫码体验的最关键的主要有以下几个因素:

    1. 识别率:这是扫码服务的基础指标,识别率能直接体现识别能力,识别率如果无法提高意味着大量的用户将无法使用更便捷的服务;

    2. 识别耗时:包括 app 启动耗时以及图像识别耗时,这是衡量一个用户从点击 app 到正确识别到内容耗时,每增加 1s,将有相当大量的用户放弃等待并离开;

    3. 精准反馈:识别结果不仅需要及时反馈给用户,还需要非常精准,特别是在目前线下有多个二维码的场景下,需要避免用户二次操作;

    本文将从以上三个方面,分享支付宝扫码技术团队是如何为用户打造一个又准又快又稳的极致扫码体验。

     

    二、提高识别率

    我们对用户反馈进行了大量统计分析,发现绝大部分识别失败都是因为二维码并不标准,并且很遗憾的是在使用我们早期的扫码版本进行识别率测试时发现识别率只有 60%;

    策略1:优化桩点查找算法长宽比耐受

    以往的扫码算法,检查长宽比例时允许差异 40%,但是由于使用前向误差,判断结果跟长宽的先后顺序相关,这会导致有些长宽比失调的码,横着扫不出来,但是旋转 90 度竖着却能扫出来了(^OMG^)。

    优化策略

    • 通过修改长宽比的判定规则,长宽比将不再受先后顺序影响;

    • 对于已知长度,修改规则将可接受的宽度范围扩大,增强长宽比的耐受;

    在我们对比测试集中,识别率提高了 1% 左右。

    策略2:新增1:5:1桩点识别模式模式

    在一张图片中,要找到二维码,关键在找二维码特征定位点:

    三个角的回字型图案,这就是二维码特征定位点。中间区域的黑白色块比例是1:1:3:1:1

    以往的扫码算法,桩点识别是通过状态机 查找11311模式后 取中间位置确定x位置(此时扫描线在第一行11311比例处)在x位置纵向搜索11311模式, 确定y位置再以(x,y)位置横向搜索11311比例,修正x位置。这种模式在桩点污损的情况下,识别能力较差只要在任何一次11311模式搜索中遇到干扰点,哪怕是一个像素的椒盐噪声也能使桩点查找失败。(支付宝蓝的桩点,会在蓝色区域产生大量噪点,导致识别率低下)

    为此,我们新增了一种桩点识别方式。在状态机达到151模式的时候,开始尝试确认桩点。(此时扫描线在第一行151比例处)。

    优化效果

    • 新的查找方法将不再受桩点中心或边缘部分被污损的影响,支付宝蓝色桩点码识别率明显提升;

    • 修改后识别率整体提升了接近 1%,但识别失败的耗时有所提升;

    策略3:添加一种对角线过滤规则

    在枚举所有可能桩点组合 O(N^3) 之前,对所有可疑桩点进行一次对角线检查过滤。由于桩点对角线也应该满足 11311模式 ,用这个规则做一次过滤可疑有效减少运算量,也就有效降低了识别成功和失败的耗时。

    策略4:基于 Logistic Regression 的二维码分类器

    在以往的扫码算法中在拿到三个桩点后,基于夹角,长度偏差,单位长度查三个数值,用简单公式计算得到阈值,判断是否为可能的二维码,误判概率较大。

    为此,我们引入机器学习中的逻辑回归算法模型。基于支付宝丰富的二维码数据集,训练出逻辑回归模型,作为二维码分类器,明显降低了误判概率,也将明显降低无二维码时识别失败的耗时。

    策略5:修改跳行扫描的间隔数

    由于输入的相机帧分辨率高,像素点多,运算量大,以往的扫码算法在水平跟垂直方向跳行采样进行计算。但在实际运算中,由于跳过了太多列,错过了11311模式中某些1位置的点,导致桩点查找失败。

    我们通过将跳行计算行数修改为可配置项,通过线上 AB 灰度测试得到最合适的跳行策略,整体配置此跳行策略后,识别率得到明显提升。

    上述优化在测试集的表现

    综上优化,扫码核心识别能力,在7744张图片测试集上提高了6.95个百分点。

    特殊策略优化

    除此上述通用扫码优化之外,我们还对特殊场景扫码能力进行提高。

    1. 畸变?不怕不怕!

    线下场景复杂多变。饮料瓶身上变形的二维码、超市小票卷起边角弯曲的二维码、路边小贩凹凸不平甚至折叠的二维码......这些畸变的二维码容易增加识别难度,甚至导致识别失败。

    以往的扫码算法抗畸变策略中,先用透视变换关系建立映射关系。优点是:适应性好,满足大多数应用场景。不足也明显:对 Version 1 的码,因为映射关系退化为仿射变换,效果较差,手机必须和码平面平行才能方便识别。当物料表面不是平面的时候,效果较差。

    优化策略

    • 假设采样坐标系到二维码坐标系遵守一个更复杂的映射关系,并且假设物料表面的卷曲较小,通过使用二次函数可以较好的拟合这个映射关系;

    • 实际发票上的二维码版本普遍大于等于 7,高版本二维码具有多个辅助定位点,更利于构造二次映射表;

    • 基于以上推论,使用新的映射代替旧的透视变换,进行更精准的采样;

    用新的策略,发票码这个场景的二维码识别能力提升明显。

    ▲注意:由于采用了增强算法,请对准二维码稍作等待。

    2. 容错识别能力提升

    商户或者供应商生成二维码后,通常会在二维码的中间部分贴上 Logo,这部分有可能会使二维码 Decode 时出错。

    优化策略:

    对于采样后拿到的 BitMatrix,对于中间部分一块矩形区域内的点,采用某些策略来改变中间点的值,使它能够通过容错边界的检查。目前采用两种策略,第一种是反转,第二种是每一个点随机取值。目前所取的矩形区域是长、宽的四分之一。

    通过此项优化后,扫码的容错能力也得到明显提升。

     

    三、更小的识别耗时

    GPU计算二值化,降低识别单帧耗时

    所谓图像二值化就是将图像上的像素点的灰度值设置为 0 或 255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。下图左边为原图,右边是二值化处理过的图。

    在扫码算法解码前,有二值化计算,图像的二值化计算能使图像中数据量大为减少,并弱化图像模糊、颜色对比度不强、光线过强/太弱、图像污损等情况下其他信息的干扰,更利于检测识别。

    传统算法是在 CPU 上进行二值化运算,非常消耗 CPU 资源,但其实 GPU 更擅长大规模并行计算,所以我们选择使用 GPU 来做二值化计算。在安卓平台上使用 RenderScript,iOS 平台上使用 Metal,都是很底层的框架。

    优化结果

    1. iOS: 统一电池、角度、光线等环境变量, 在iPhone6上测试扫码核心5种摄像头二值化算法。表现如下:

    可以看出,在图像二值化方面 Metal 有相当高的优势,相比原来的单纯 CPU 处理快了接近 150%, 同时降低了近50个百分点的CPU资源。

    2. Android机型众多,我们抽取了线上数据,可以看到GPU 在二值化处理中显著降低了单帧耗时30%以上。

     

    单帧耗时

    传统二值化

    65ms

    RS二值化

    44ms

     

    四、调度维稳

    线下物料千奇百怪,扫码算法为了解决一些不理想的场景,如二维码有遮挡、污损、模糊或角度很不好的特殊情况,需要使用一些比较耗时但比较强大的算法,但普通情况不需要这些算法。所以,我们对识码算法定了优先级,通过时间推移、跳帧触发等方式调度:

    优先级:暂定高中低三个优先级。

    • 高优先级 每帧执行

    • 中优先级 降帧率执行

    • 低优先级 低帧率执行

    • 不同优先级的功能执行时机可配置。不同功能属于哪个优先级可配置

    特殊场景算法——为码核心的一种特定能力,如:

    • 反色码识别能力

    • 容错边界码识别能力

    • 污损桩点识别能力等

    • 条码识别能力

     

    看完以上这些,你get了吗?

     

    源自支付宝的扫码组件,现已全新升级,全网免费开放!扫码下方二维码或点击此处立即免费接入。

     

     

    END

     

     


     

     

     

    展开全文
  • 微信小程序扫描二维码识别商品的简单项目 可用作基本框架
  • 文章目录1、二维码应用场景及安全问题2、二维码登录的本质3、二维码验证机制的原理解析4、深入理解二维码在登录的交互过程5、总结感悟 1、二维码应用场景及安全问题 二维码使用广泛,生活处处都有二维码的使用场景。...
  • 因公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能。根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好)。现在将调用摄像头+识别二维码这两个功能...
  • 本文讲解如何使用原生框架实现二维码扫描功能,并且进行扫描后的项目跳转。具有很好的参考价值,下面跟着小编一起来看下吧
  • 主要为大家详细介绍了java使用电脑摄像头识别二维码,从摄像头获取图像,再根据图片解析出二维码信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 随着二维码的广泛应用和Android智能手机的进一步普及,该文介绍了一个通过Android平台下的摄像和绘图功能, 利用二维码的编码和解码...的功能,识别系统完成对采集到的二维码符号进行译码还原出所携带信息的功能。
  •  现在越来越多的应用加入二维码相关的业务,在iOS开发市场上很多开发人员都在使用第三方的扫码与生成二维码的控件,个人认为此类的第三方控件识别度不高。最近正好整理新框架的事情,研究了一下。具体代码如下  ...
  • 二维码二维码识别

    千次阅读 2022-04-10 10:40:02
    支持各类二维码、条形等的识别; 多种混合识别,且红色框线定位; 支持png, jpg, bmp等各种图片格式; 绿色工具免安装,识别效率快准狠。
  • uniapp中应用H5自定义二维码扫码界面

    千次阅读 热门讨论 2020-09-10 15:48:17
    uniapp中应用H5自定义二维码扫码界面最终效果pages配置组件代码 最终效果 pages配置 { "path": "components/barcode/scan-page", "style": { "navigationBarTitleText": "扫一扫" } } 组件代码 <template&...
  • 调用手机相机扫码,也可从相册中识别二维码,此段代码的扫一扫功能!不需修改,按钮或超链接调用即可进入扫一扫界面。
  • 基于浏览器实现二维码扫码增强版-带视频演示Safari浏览器亲测效果基于H5流媒体,调用手机摄像头实现扫码基于URL Scheme,调用第三方APP实现扫码 模拟app扫码效果,支持前置摄像头后置摄像头切换,纯js+h5+css3实现,...
  • 目录前言官网的Demo和Sample代码体验1 开发准备1.1 android studio 安装1.2 在项目级gradle里添加华为maven仓1.3 在应用级的build.gradle里面加上SDK依赖1.4 加一下混淆配置1.5 Manifest申请静态权限和扫码页面声明...
  • 二维码扫码和相册二维码提取的方法在原生系统 AVFoundation 的 SDK 中提供了摄像头设备扫描捕获和检测提取的相应方法,具体方法 code 如下: 注:如下方法需在 iOS7 系统之后,通过系统中 AVMetadataObject 提供的...
  • 在C#下通过DirectShow控制摄像头,实现快照后解码二维码。 在win2k3及win7下测试通过,是...希望此代码对使用C#开发摄像头和二维码应用的人有用。 如果希望将解码信息发送到指定服务器,有服务器端处理信息的请留言。
  • 1、使用jweixin-1.4.0.js实现微信公众号Html5页面调用手机照相机识别二维码 2、核心代码已经给到txt文件中,可以根据需要自行扩充。 3、二维码可以由自己的API生成,应用到很多领域。
  • 了解人脸识别二维码识别

    千次阅读 2020-11-26 13:53:57
    人脸识别方案 CoreImage (二维码识别,人脸识别) face++ 2014阿里 收费(两种方案本地计算 服务器计算) 腾讯优图 OpenCV (人脸识别 滤镜等) ...3.指定检测的元数据类型(人脸,二维码,一维) 4.开
  • 扫码功能支持连续扫码,获取图片 使用方式 // 在js中引用 import WsCarema from "@/components/ws-carema/index.vue" components:{ WsCarema }, // 在界面中引用 <view class="container"> <ws-carema ...
  • 最近尝试着将深度学习技术引入到二维码检测和识别中,期望能够提升传统二维码的识读性能,能够适用更多复杂背景,并且最终应用到工业生产中,方便生产线上对产品的ID管理。 项目最终实现效果如下所示: ...
  • TCPIP远程网络电子健康码扫码设备|二维码扫码门禁机HX-QR86L-IP是一款铝合金材质、带液晶显示屏,一机两用,即可做门禁读头使用,也可以做电子健康码数据采集使用。可支持静态、手机动态二维码识别、支持电子健康...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,501
精华内容 3,400
关键字:

二维码扫码识别应用

友情链接: dianji.zip