华为HMS Scankit与Zxing到底谁强谁弱

前言

Zxing 是一种城市表面比较常见的三方开源扫码 sdk ,但是 Zxing 的缺陷在于只是实现了扫码的一些基础操作,对于更为复杂的扫码环境而言强光,弯曲,形变等情况,并不能很好地支持。现在主流的做法是基于 Zxing 的二进制代码做部分优化,但是效果依然不算理想,同时将会花费很多人力。

 华为统一扫码服务(扫描套件)提供便捷的串行和二维码扫描,解析,生成能力,可以帮助开发者快速构建应用内部的扫码功能。得益于华为在计算机视觉领域长期能力积累,华为统一扫码服务(扫描试剂盒)可以实现远距离码或小型码的检测和自动放大,同时针对常见复杂扫码场景(如反光,暗光,污损,模糊,柱面)做了针对性识别优化,提升扫码成功率与用户体验。

Zxing与华为HMS Scan Kit对比分析

下面,小编重新调整如下几个维度,带大家一起来一下一下 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 胜

SDK 包大小对比

斑马线的包大小是 50万左右,是一个比较满意的大小。扫描工具分为两种模式,精简版模式和专业模式。精简版模式下包为 700K ,亲模式下 3.3MB 。如果结合表格会有一个更清晰的理解。

翻译过来就是这两个模式只是在非华为手机上会有些许分歧,所以非华为手机同时对包大小不太敏感的用户尝试可以选择 pro 的版本。我也做过非华为手机 lite 版本的测试,效果只是比 pro 版本略微改善下降。

对比文献: Zxing 略有优势

平台支持对比

Zxing 和 Scan Kit 同时支持 ios 和安卓平台的。

对比文献:平手

集成方式对比

Zxing 的集成方式相对比较简单,只要几行代码即可快速集成 sdk ,但是在实际产品开发的过程中,将会涉及到产品界面以及辅助功能 的开发,而 Zxing 并没有提供相应 的快速集成方式。但由于存在的时间比较长,网上有很多相关的集成指导,所以相对可以减少一点开发缺陷,在此不做详细介绍。总结起来, Zxing 集成中比较繁琐的在于第一,没有其他的界面可以使用;第二,需要自己实现自动放大,闪光灯等功能。

扫描工具包提供了多种接收方式,包括单码接收,多码接收,自定义接收等。集成方式的区别在于:

Scan Kit 的单码接收会议提供的布局布局,同时预先好了自动放大,闪光灯等一系列功能,无需开发者再手工配置这些。代码的集成量为 5 行,特别适用于快速集成,快速替换扫码功能的场景。

扫描工具包的自定义接收重定向用户自己去设计布局,仅提供扫码和解码的基本功能和空白布局,用户可以根据自己应用的风格去设计,但是需要自己去实现自动放大,闪光灯等功能,相对应的技术文档都可以在华为开发者光网上找到。但是相较于单码接收会复杂得多。

具体的集成方式为:

Zxing 集成流程

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 清单文件中对扫码页面进行声明。      

<!--相机权限--> 
<uses-permission android:name="android.permission.CAMERA" /> 
<!--读文件权限--> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<!--使用特性--> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" />

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 展开做一个技术分析。

Zxing 技术分析

斑马线使用的是传统的识别算法,找通过一些特定的特征点去检测码,这个算法只能允许一定程度上的形变,比如正方形的码略微倾斜 10 度以内,他的像素点还是符合特征点规则的,但是如果形变过大或者角度过大,那么就无法检测出码的位置。Zxing 的检测流程分为两类:一维码和二维码串行检测

在一维码检测中, Zxing 会使用一个逐行扫描的机制进行特征识别。由于一维码特征都是黑白交叉的,所以在识别到类等间距的黑白黑白序列的时候,就会认为这是一个潜在的码。然后通过寻找起始位和终止位去规定潜在码的长度。然后将这个序列送入不同的一维码解码模块,串行进行解码,耗时的时间也可以,当串同时,一旦一维码出现褶皱,旋转或者是形变,那么逐行扫描则没法发现满足特定要求的序列,即无法检测出复杂条件下的一维码。

在二维码检测中, Zxing 针对不同的二维码分别使用了不同的检测算法,如果以最常见的 QR 码为例,由于 QR 码有三个位置检测图形,所以 Zxing 依然会使用隔行扫描的形式去找位置探测图形的特征​​,一旦发现黑白比列为 1:1:3:1:1 的特征,即取位置探测图形的中心点作为参考点进行仿射变换,从而将矫正正过后的图片送入 QR 解码模块。由于 QR 码的定位点本身具有校正旋转的功能,因此可以很好的适应旋转情况,但是对于定位点部分遮挡,形变,污损反光等情况, Zxing 完全没有能力处理。 ,,位置检测图形是检测二维码是否成功的最关键的一步。一旦一个位置检测失败,二维码都不能被检测出。

华为 HMS扫描套件技术分析

扫描套件使用了深度学习的算法,具有空间不变性,通过训练对应的代码种类的检测器,可以快速找到满足要求的所有代码。

实际流程:

条码检测模块,角度预测模块均使用深度学习的模型

条码检测:不再拘束于 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

猜你喜欢

转载自blog.csdn.net/m0_47756434/article/details/106247139