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