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

前言

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集成流程

  1.   新建项目,导入Zxing模块
    
  2.   添加权限,动态申请权限
    
  3.   复写onActivity方法
    
  4.   调用解码函数
    
  5.   编写UI界面,正确显示
    

Scan Kit集成流程

Default View Mode提供相机扫码和导入图片扫码两个功能,提供完整的Activity,不需要开发者开发扫码界面的UI。

流程几乎与Zxing相同

  1. 新建项目,导入Scan Kit模块
    
  2. 添加权限,动态申请权限
    
  3. 复写onActivity方法
    
  4. 调用解码函数
    

以使用Default View Mode进行集成举例,详细集成步骤如下:

1.新建项目,在app/build.gradle文件中在线依赖:

mplementation 'com.huawei.hms:scan:{version}'
  1. 在调用模块的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();
  1. 调用“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://github.com/HMS-Core/hms-scan-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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352