很多软件都支持二维码扫描,部分手机ROM还内置了单独的扫一扫功能,但是你是否发现了,微信的扫码速度似乎特别的快,而且很精准。这是为什么呢?
微信官方公众号“微信派”就特别介绍了微信二维码扫描功能的一些技术细节。
二维码和我们在几乎所有产品上能看到的条形码一样,都是通过条码的组合记录信息,不过比条形码(本名应为一维码)多一个维度,因而能够存储更高密度的信息,比如图片、汉字、数字。
扫码过程其实就是不断对焦、采集图像、识别的过程,而采集的帧数越少,代表扫码速度越快,可以理解为图形处理器每秒钟能够刷新几次。
据粗略估算,微信目前一年要处理至少二维码达千亿级,市面上超过60%的二维码都诞生于微信平台,相当于每个微信活跃用户平均每年都会扫描140次甚至更多的二维码。
【微信扫码的秘密:引擎+算法】
微信扫码使用了自家开发的QBar引擎,并计入了预判算法,在识别条码之前会过滤无码图像,只识别有意义的内容——二维码和条形码。
整个扫码预判模块位于核心识别引擎之前,不再需要对输入的视频中的每一帧图像进行检测识别,能实现快速过滤大量无码图像,减少后续不必要的定位和识别对扫码客户端造成的阻塞,使响应更加及时,增加扫码过程中的流畅度,而这就是微信扫码快速的关键原因。
微信团队分析数据显示,该引擎在识别正常图片时的解码速度,iOS可缩短至5毫秒,安卓也仅仅约12毫秒,当然这也和手机配置尤其是摄像头有很大关系。
扫码预判模块流程图
对于无码图像,主流手机的处理速度均有较大幅度地提高,部分机型平均运行时间降低到10毫秒以内。
对于有码图像,二维码的平均识别也快了近35%,而且维持了识别率。
不同机型无码样本测试速度对比
【“坏码”也能扫】
一些二维码就算出现穿孔、污损或者弯折,还是一样可以识读,这是因为二维码中存储的信息通常都经过了纠错编码,是有冗余的。
一个二维码所能表示的比特数是固定的,包含的信息越多那么冗余度就越小,反之亦然。微信二维码中包含的信息量并不需要很大,这意味着编码的冗余度可以做得较高,所以即使损毁面积达到30%也依旧可以恢复。
QBar扫码引擎对二维码容错性解码算法、多语言字符检测算法等均使用进行了数十项优化,在识别率和识别速度上得到了提升。
简单来说,QBar识别及解码的流程包括:
- 读取视频或图像,通过灰度化处理得到单张灰度图;
- 对灰度图进行处理得到二值图像(二值化是引擎在识别前把图像转换成01图像的过程);
- 将二值图输入不同的解码器识别是否存在二维码;
- 如果检测到存在某种编码,即通过相应的解码器进行解码,并返回解码结果。
QBar引擎识别解码流程
在提高成功解码的概率上,微信的另一个做法就是给每个步骤做上“标签”,目的是找出错误信息,对失败信息再设置相应的二次检测流程,在失败的步骤处进行更”努力”地尝试,且越到后面的步骤,表明图中存在二维码的概率越大。