Zxing 是一种城市表面比较常见的三方开源扫码 sdk ,但是 Zxing 的缺陷在于只是实现了扫码的一些基础操作,对于更为复杂的扫码环境而言强光,弯曲,形变等情况,并不能很好地支持。现在主流的做法是基于 Zxing 的二进制代码做部分优化,但是效果依然不算理想,同时将会花费很多人力。
华为统一扫码服务(扫描套件)提供便捷的串行和二维码扫描,解析,生成能力,可以帮助开发者快速构建应用内部的扫码功能。得益于华为在计算机视觉领域长期能力积累,华为统一扫码服务(扫描试剂盒)可以实现远距离码或小型码的检测和自动放大,同时针对常见复杂扫码场景(如反光,暗光,污损,模糊,柱面)做了针对性识别优化,提升扫码成功率与用户体验。
下面,小编重新调整如下几个维度,带大家一起来一下一下 Zxing 和华为 HMS Scan Kit 的能力差异,分别是:
Ø 远距离扫码
Ø 复杂场景扫码
Ø 任意角度扫码
远距离扫描码成功依赖于二维码的规格(信息量识别识别误差和)以及相机离二维码的距离。由于 Zxing 缺乏对于自动放大的优化,常规条件下,在码字小于屏幕占比 1/5 的时候会出现识别困难的情况。反观 HMS扫描套件,由于在流程上多了一个预检测的功能,即使是肉眼无法分辨,也可以很好的自动放大超远距离的二维码。
Ø 多码识别
Ø 集成难度
Ø SDK 包大小
Ø 跨平台使用支持
远距离扫描码成功依赖于二维码的规格(信息量识别识别误差和)以及相机离二维码的距离。由于 Zxing 缺乏对于自动放大的优化,常规条件下,在码字小于屏幕占比 1/5 的时候会出现识别困难的情况。反观 HMS扫描套件,由于在流程上多了一个预检测的功能,即使是肉眼无法分辨,也可以很好的自动放大超远距离的二维码。
对比文献: Scan Kit 胜
复杂场景的扫码主要分为反光,暗光,污损,模糊,柱面。在复杂场景下, Zxing 的识别效果比较差。另外复杂场景如下:
这些场景在生活中很经常会遇到,某些在上方会经常遇到反光,暗光,污损等场景,在二维码贴在商品上时会出现曲面甚至棱角的情况。在边走动边扫编码时,也会遇到运动模糊的挑战。针对这几个场景一起来看下直观测试对比:
对比文献: Scan Kit 胜
ZScan 中目前只能支持正向的扫码,而没有办法识别具有一定角度的码。但是 Scan Kit 可以轻松的完成这一点,当码的对准在 10 度以内的时候, Zxing 还是能够有较早高的识别准确度的,但是当超过这个角度以后, Zxing 的识别准确度会急剧下降,而 Scan Kit 可以一直不受夹角的影响,准确率没有任何下降。
对比文献: Scan Kit 胜
多码识别可以帮助快递快递,超市收银等场景实现一次识别多个码,提高业务处理效率。多码识别模式下,扫描套件可以同时识别屏幕上不限种类的 5 个码,一次返回所有码的对应类型和码值
对比文献: Scan Kit 胜
斑马线的包大小是 50万左右,是一个比较满意的大小。扫描工具分为两种模式,精简版模式和专业模式。精简版模式下包为 700K ,亲模式下 3.3MB 。如果结合表格会有一个更清晰的理解。
翻译过来就是这两个模式只是在非华为手机上会有些许分歧,所以非华为手机同时对包大小不太敏感的用户尝试可以选择 pro 的版本。我也做过非华为手机 lite 版本的测试,效果只是比 pro 版本略微改善下降。
对比文献: Zxing 略有优势
Zxing 和 Scan Kit 同时支持 ios 和安卓平台的。
Zxing 的集成方式相对比较简单,只要几行代码即可快速集成 sdk ,但是在实际产品开发的过程中,将会涉及到产品界面以及辅助功能 的开发,而 Zxing 并没有提供相应 的快速集成方式。但由于存在的时间比较长,网上有很多相关的集成指导,所以相对可以减少一点开发缺陷,在此不做详细介绍。总结起来, Zxing 集成中比较繁琐的在于第一,没有其他的界面可以使用;第二,需要自己实现自动放大,闪光灯等功能。
扫描工具包提供了多种接收方式,包括单码接收,多码接收,自定义接收等。集成方式的区别在于:
Scan Kit 的单码接收会议提供的布局布局,同时预先好了自动放大,闪光灯等一系列功能,无需开发者再手工配置这些。代码的集成量为 5 行,特别适用于快速集成,快速替换扫码功能的场景。
扫描工具包的自定义接收重定向用户自己去设计布局,仅提供扫码和解码的基本功能和空白布局,用户可以根据自己应用的风格去设计,但是需要自己去实现自动放大,闪光灯等功能,相对应的技术文档都可以在华为开发者光网上找到。但是相较于单码接收会复杂得多。
具体的集成方式为:
1. 新建项目,引入 Zxing 模块
2. 添加权限,动态申请权限
3. 复写 onActivity 方法
4. 调用解码函数
5. 编写 UI界面,正确显示
默认查看模式提供相机扫码和引入图片扫码两个功能,提供完整的活动,无需开发者开发扫码界面的 UI 。
流程几乎与 Zxing 相同
1. 新建项目,引入 Scan Kit 模块
2。 添加权限,动态申请权限
3. 复写 onActivity 方法
4. 调用解码函数
以使用默认查看模式进行集成模拟,详细集成步骤如下:
1. 新建项目,在 app / build.gradle 文件中在线依赖:
实施'com.huawei.hms:scan:{version}'
2. 在调用模块的 AndroidManifest.xml 清单文件中对扫码页面进行声明。
3. 根据实际需求创建扫码选项参数
HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE , HmsScan.DATAMATRIX_SCAN_TYPE).create();
4. 调用“ ScanUtil” 的静态方法“ startScan” 启动Default View 扫码页面。
ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, options);
通过对比可以发现在 Scan Kit 和 Zxing 在添加依赖项,申请权限方面没有什么区别,调用方式也很类似,但是 Scan Kit 可以替换使用 UI (里面内置了闪光灯,自动焦距,图片导入二维码等功能) ,但是 Zxing 还需要自己去实现 UI接口,然后分别手动完成这些功能。
对比文献: Scan Kit 胜
为什么 Scankit 要比 Zxing 识别效果好呢,小编下面从技术实现原理角度对 Zxing 以及 Scan Kit 展开做一个技术分析。
斑马线使用的是传统的识别算法,找通过一些特定的特征点去检测码,这个算法只能允许一定程度上的形变,比如正方形的码略微倾斜 10 度以内,他的像素点还是符合特征点规则的,但是如果形变过大或者角度过大,那么就无法检测出码的位置。Zxing 的检测流程分为两类:一维码和二维码串行检测
在一维码检测中, Zxing 会使用一个逐行扫描的机制进行特征识别。由于一维码特征都是黑白交叉的,所以在识别到类等间距的黑白黑白序列的时候,就会认为这是一个潜在的码。然后通过寻找起始位和终止位去规定潜在码的长度。然后将这个序列送入不同的一维码解码模块,串行进行解码,耗时的时间也可以,当串同时,一旦一维码出现褶皱,旋转或者是形变,那么逐行扫描则没法发现满足特定要求的序列,即无法检测出复杂条件下的一维码。
在二维码检测中, Zxing 针对不同的二维码分别使用了不同的检测算法,如果以最常见的 QR 码为例,由于 QR 码有三个位置检测图形,所以 Zxing 依然会使用隔行扫描的形式去找位置探测图形的特征,一旦发现黑白比列为 1:1:3:1:1 的特征,即取位置探测图形的中心点作为参考点进行仿射变换,从而将矫正正过后的图片送入 QR 解码模块。由于 QR 码的定位点本身具有校正旋转的功能,因此可以很好的适应旋转情况,但是对于定位点部分遮挡,形变,污损反光等情况, Zxing 完全没有能力处理。 ,,位置检测图形是检测二维码是否成功的最关键的一步。一旦一个位置检测失败,二维码都不能被检测出。
扫描套件使用了深度学习的算法,具有空间不变性,通过训练对应的代码种类的检测器,可以快速找到满足要求的所有代码。
实际流程:
条码检测模块,角度预测模块均使用深度学习的模型
条码检测:不再拘束于 Zxing 一维码二维码分开检测的串行流程,可以使用训练好的检测器直接得到码型和对应位置。一次检测即可精准的将条码送入对应的解码模块,,也不再需要单独的串行解码流程,由于解码中包含跳行扫描等一系列附加比较大的操作,而且解不同的代码的信息无法共享,因此此操作大大降低了端到端的时延,避免了很多重复没有必要的计算费用。
实际中,条码检测的核心就在于边界点的精确获取,图片经过不精确的辐射变换在二值化后送入解码模块,依然是角度预测:返回该代码的对应三位角度,从而进行辐射变换。不会得到很好的解码效果。这也是解决复杂场景下条码识别的最关键一步。
总结起来说,深度学习将 Zxing 的条码串行检测和解码流程转换为并行流程,同时,也将条码的三位角度值返回,通过仿射变化得到对齐的标准正面条码,在大大提高了条码检测的成功率的同时显着降低了时延。
华为开发者官网上也有相应的演示演示,示例代码和开发文档
演示 demo 和示例代码:
https://developer.huawei.com/consumer/cn/doc/development/HMS-Examples/scan-sample-code4
开发指南:
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/scan-introduction-4
API 参考:
https://developer.huawei.com/consumer/cn/doc/development/HMS-References/scan-apioverview