Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >二维码扫码技术优化方案

二维码扫码技术优化方案

原创
作者头像
ios-lan
修改于 2020-10-26 02:46:51
修改于 2020-10-26 02:46:51
5.3K0
举报
文章被收录于专栏:ios技术安装ios技术安装

一、背景

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

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

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% 以上。

四、调度维稳

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

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

  • 高优先级 每帧执行
  • 中优先级 降帧率执行
  • 低优先级 低帧率执行
  • 不同优先级的功能执行时机可配置。 不同功能属于哪个优先级可配置

特殊场景算法:

为码核心的一种特定能力,如:

  • 反色码识别能力
  • 容错边界码识别能力
  • 污损桩点识别能力等
  • 条码识别能力

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
难得干货,揭秘支付宝的2维码扫码技术优化实践之路
本文引用自“蚂蚁金服科技”公众号,原文由支付宝技术团队原创分享。 本次收录时有改动。
JackJiang
2020/09/25
1.8K0
微信一年扫出多少个二维码?
图像作为一种特殊的语言形式,它克服了音声语言的转瞬即逝性,把信息长久保存下来,传播不再单纯依赖人类记忆力。 二维码通过图形记录着一组二进制数据,成为设备之间交流的文字。 2011年,微信的诞生成为人类社交又一工具;随着它的成长,也使得以图像映射文字的“语言”——二维码被重新表达。 微信的诞生始于移动端,并在此之上不断演进。 2012年,微信用户超过2亿,通过二维码来实现服务功能的产品开始迅速进入人们眼球。目前,微信月活跃用户达到7亿,内置于其中的扫一扫功能成了人手一台的扫码器。 1 微信让扫二维码
腾讯大讲堂
2018/02/13
3.1K1
微信一年扫出多少个二维码?
二维码纠错级别与容错能力详解
要理解二维码的纠错级别 error correction level 简称 ECL,就须先洞察二维码的基本结构。二维码由模块(module)组成,每个模块表示一个比特(bit)信息。为了让二维码在部分污损、刮痕或者印刷不清的情况下依然可被扫描器正确识别,引入了 Reed Solomon 误差纠正算法。误差纠正通过增加冗余码字(error correction codewords)为扫描器提供恢复丢失信息的能力。
编程小妖女
2025/06/13
1070
二维码纠错级别与容错能力详解
微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力
2011年12月微信3.5版本正式上线“扫一扫”二维码,历经9年蜕变,“扫一扫”从二维码名片到扫码支付、从小程序码到健康码,二维码已经成为一种生活方式,连接着数字与现实。
AI算法与图像处理
2021/02/05
5.1K0
微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力
图像中二维码的检测和定位
所谓开操作是指先腐蚀后膨胀的操作。在之前的文章二值图像分析:案例实战(文本分离+硬币计数)曾经介绍过开操作的用途。
fengzhizi715
2018/08/24
3.6K0
图像中二维码的检测和定位
有关python下二维码识别用法及识别率对比分析
 最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar 、zbarlight、zxing。
黯然销魂掌
2018/09/27
3.4K2
java生成二维码前言:java生成二维码demo:总结:
先聊聊题外话,话说在1994年,日本的丰田汽车公司独立出来了一个电装公司。由于高精度的汽车零配件需要匹配很多信息,而传统的条形码容量有限,在电装公司的腾弘原的带领下,经过两年时间,发明了二维码,二维码信息存储量是条形码的250倍。 然而,日本人并没有重视这项发明。这时我们勤劳勇敢的龙的传人坐不住了,在2011年由于淘宝的壮大,二维码支付由支付宝正式引入中国,同时某人还拿下了二维码扫一扫专利,光依靠海外专利权就赚了至少7个亿。 本来是日本人发明的,到最后日本人不但没有得到专利费,用自己的东西还得交专利费,是不是大快人心? 步入正题,在当今二维码横行的时代,我们做项目时肯定也会遇到要生成二维码的时候,接下来就看看如何生成二维码。点我下载源码。
贪挽懒月
2018/08/02
5.1K0
java生成二维码前言:java生成二维码demo:总结:
基于算法优化及深度学习的摄像头扫码速度提升实践
摄像头扫码在移动端应用得非常广泛,比如生活中,我们经常会扫付款码用于支付,在餐厅会扫码点餐,扫码添加公众号,扫快递单号,商品条码等等,应用场景几乎涵盖了生活的方方面面。所以扫码体验对于移动产品来说非常重要,直接影响了产品的转化率和用户满意度。摄像头扫码速度也一直是有赞的几个移动 App 最关注的指标之一。
有赞coder
2021/11/26
1.7K0
基于算法优化及深度学习的摄像头扫码速度提升实践
【从零学习OpenCV 4】QR二维码检测
二维码被广泛的应用在我们日常生活中,比如微信和支付宝支付、火车票、商品标识等。二维码的出现极大的方便了我们日常的生活,同时也能将信息较为隐蔽的传输。二维码种类多种多样,有QR Code、Data Matrix、Code One等,日常生活中常用的二维码是QR二维码,该二维码样式以及每部分的作用在图7-30给出。二维码定点方向有三个较大的“回”字形区域用于对二维码进行定位,该区域最大的特别之处在于任何一条经过中心的直线其在黑色和白色区域的长度比值都为1:1:3:1:1。二维码中间具有多个较小的“回”字形区域用于二维码的对齐,根据二维码版本和尺寸的不同,对齐区域的数目也不尽相同。
小白学视觉
2020/02/20
1.9K0
【从零学习OpenCV 4】QR二维码检测
一码通的时代,如何实现二维码的检测和解码?手把手教你!
👆点击“博文视点Broadview”,获取更多书讯 深度学习计算机视觉的惊人成绩让计算机视觉的传统算法在目标检测领域逐渐淡出人们的视野,但是在许多应用程序中,这些传统算法依旧发挥着重要的作用。 它们在出现伊始也产生了轰动的效果,如 HOG 算法在行人检测方面的巨大优势,因此,若想深入学习图像处理,还是很有必要重温这些传统算法的。 OpenCV 中的 objdetect 模块封装了传统计算机视觉的目标检测算法,引入该模块需要包含头文件"opencv2/objdetect.hpp",通过该头文件,读者可以了解
博文视点Broadview
2023/04/12
1.7K0
一码通的时代,如何实现二维码的检测和解码?手把手教你!
🔥 Spring Boot 3 整合 zxing:轻松生成二维码的指南
在数字化时代,二维码已成为连接线上线下世界的重要桥梁。无论是支付、信息分享还是产品溯源,二维码都扮演着关键角色。本文将带你探索如何在 Spring Boot 项目中整合 zxing 库,快速生成功能强大的二维码。通过本教程,你将掌握从零开始实现二维码生成功能的完整流程,并了解如何自定义二维码的各种参数。
别惹CC
2025/06/16
2290
🔥 Spring Boot 3 整合 zxing:轻松生成二维码的指南
二维码扫描开源库ZXing定制化
最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下。
sickworm
2019/02/27
3.7K0
二维码扫描开源库ZXing定制化
说说二维码盒子
今天我想给大家聊一聊二维码盒子,我在做这个产品过程中踩了很多坑,希望能给大家一些启示。
金融民工小曾
2018/09/14
2.4K0
说说二维码盒子
二维码支付的那些事儿
在银行做了几年支付业务,这几年,我算是一个二维码支付业务从诞生到蓬勃发展到现在几乎在线下取代了传统银行卡和现金交易的一个推动者和见证者,这篇文章我想谈谈这些年二维码支付业务的那些事儿。
金融民工小曾
2018/09/14
2.7K0
二维码支付的那些事儿
快速关联微信小程序二维码实现聚合扫码
相信大家在停车场遇到过这样的场景,在停车场入场和出场时,不管我们是用微信还是支付宝,只需台扫同一个二维码,自动识别打开各端小程序,并带入参数停车场id和通道id。
Onegun
2022/06/16
1.8K0
快速关联微信小程序二维码实现聚合扫码
swift手撕二维码一、简介二、二维码综合案例
超市付款扫一扫,免费wifi扫一扫,添加好友扫一扫。 二维码就像是神一般的存在!! 可是到底二维码是个啥呢? QRCode.jpg 一、简介 1、概念 用某种特定的几何图形按照一定规律在平面分布的
谦谦君子修罗刀
2018/05/02
1.9K0
swift手撕二维码一、简介二、二维码综合案例
二维码扫码支付原理
平常我们在购物付款时,使用手机中的微信或支付宝扫一扫即可完成支付,无需像以前携带现金等着商户找零钱。线下扫码支付大大的提高了我们付款的效率,今天就主要谈一谈扫码支付的实现流程,让我们享受快捷的同时,也了解其中的原理。
yaphetsfang
2020/07/30
4K0
二维码扫码支付原理
二维码会使用完么?
现在生活中总是会使用到二维码,在支付中、博客的推广图片上、各种各样的商品推广,都有着二维码的身影,二维码已经是我们的日常生活中有着不可替代的便捷信息载体,近几日在网站了解到字节及腾讯根据自己的产品分别推出了抖音码及小程序码的解析流程,心中有一个疑问:“二维码会被使用完么”,在近一周的资料查询及二维码原理分析,我得到的答案是“二维码会被使用完,但我们目前使用不完”,“二维码会被使用完”是因为二维码是采用黑白点阵组成的一段特殊的代码,可以理解为一张特殊的图片,那么这张图片大小比较固定,那么也就代表着二维码会被使用完,而“我们目前使用不完”是因为点阵组成的二维码个数实在是太多了,即使在我们生活中大量应用,每天都有几百亿个二维码产生,还是使用不完。
Meng小羽
2019/12/24
8800
Python学习案例之二维码生成识别
在 JavaWeb 开发中,一般使用 Zxing 来生成和识别二维码,但是,Zxing 的识别有点差强人意,不少相对模糊的二维码识别率很低。不过就最新版本的测试来说,识别率有了现显著提高。
小柒2012
2019/12/05
1.2K0
Go语言生成二维码是如此简单
二维码作为一种快速的输入手段越来越流行,支付,添加好友,买东西,扫个二维码就可以,非常方便。那么二维码是如何制作生成的呢?我们如何制作自己的二维码呢?
飞雪无情
2018/08/28
2.2K0
推荐阅读
相关推荐
难得干货,揭秘支付宝的2维码扫码技术优化实践之路
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档