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