菊花绽放:微信是如何识别小程序码的?

作者:lincolnlin,endyxu,changoran

【小程序码-设计篇】菊花绽放 一文中介绍了小程序码的设计过程,本文继续分享我们在小程序码识别上面的一些心得,权当抛砖引玉,欢迎有共同兴趣的同事一起讨论。

识别之前,我们需要对照片做什么处理

打开扫一扫,扫码引擎通常采集到的图片是这样子的。

引擎其实并不关心这朵菊花是什么颜色,因此,我们把图片简化,处理成灰度图。

二值化可以让引擎做的事情更简单,因此再将灰度图处理成位图。

如何在黑白图中快速找到菊花的位置

细心的朋友肯定注意到,每一朵菊花都有两个共同点:

  • 3 个圆形的“牛眼”(定位点)
  • 右下角的“小程序 LOGO”

以上是小程序码的定位信息,准确的定位是识别的第一步。

如何快速找出所有可能的定位点

在设计这个菊花码时,我们是按照 0.8 : 1.2 : 1 : 1.2 : 0.8 绘制定位点的。

为什么不采用 1:1:1:1:1 的比例?因为前者比例比较贴近黄金比例,更符合人类审美需求。(下图右为 1:1:1:1:1)

基于这个特性,使用水平,垂直,45 度角等三个方向的扫描线扫描全图。如果三个方向的黑白像素都接近这个比例,显然它极可能是一个定位点。

怎么定位“小程序 LOGO”

最简单的方法,根据 3 个定位点的位置,预估小程序 LOGO 的中心位置(平行四边形)

在很多扭曲的情况下,上述方法仍有较大偏差。因此我们提出了一种改进方法:基于 LOGO 为圆形的特性,将预估的中心点修正到圆心位置

具体校正方法如下:

拍摄出来的码这么“歪”,能否进行“摆正”

由于上文中,我们已经找到了码在图像中的位置,但由于这个码可能已经被旋转,扭曲,所以,我们需要再做一次矩阵变换(透视变换),将其变换到直角坐标系。变换后的码,已经比较易于被机器解读了。

怎么读码

二维码怎么读码

上述流程和传统二维码识别的核心思想并无二致,如果你坚持看到这里,说明你已经知道如何识别二维码了。

经过透视变换,二维码其实已经变成了单位矩阵(如上图,你可以理解一个小块为一个像素点,这里为了方便阅读,放大了),那么,我们顺着二维码的编码路径,就能完整地读出编码信息了。

小程序码怎么读码

其实,按照二维码的套路,我们可以把透视变换后的图,进行编码区域划分。值得注意的是,这里一个彩色小块并非一个像素点,而是一片区域。一个编码块是 0 还是 1,取决于该区域上的黑色像素(面积)的比例,我们称之为“投票法”。

是否有其他读码方案

但在实际应用中,我们发现该方法对于扭曲的场景,识别效率很低,鲁棒性不佳。经过各种尝试和思考,我们借鉴了一维码的识别思路 ——“采样法”。

举个例子,上图中,我们用红色扫描线采样一维码的信息,对于采样的一行像素,我们根据比例读出具体的编码。

类比该方案,我们利用小程序码为“放射线”编码的特性,采样每一条放射线上的一个像素序列,根据黑白比例读出每一条线的编码信息。

目前扫码引擎的性能如何,能应对什么场景

在测试阶段,我们内部自行拍摄采集了各种场景下的大量测试样本,做了如下评测

包括如下场景

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

许典平的专栏

1 篇文章2 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

AI可能真的要代替插画师了……

事先声明,这篇文章的标题绝不是在耸人听闻。事情的起因是今天早上在朋友圈看到同学在转发一篇论文,名字叫《Create Anime Characters with ...

18810
来自专栏CSDN技术头条

AI 可能真的要代替插画师了……

事先声明,这篇文章的标题绝不是在耸人听闻。事情的起因是前段时间在朋友圈看到同学在转发一篇论文,名字叫《Create Anime Characters with ...

1858
来自专栏人工智能头条

AI 可能真的要代替插画师了……

1263
来自专栏阮一峰的网络日志

TF-IDF与余弦相似性的应用(三):自动摘要

有时候,很简单的数学方法,就可以完成很复杂的任务。 这个系列的前两部分就是很好的例子。仅仅依靠统计词频,就能找出关键词和相似文章。虽然它们算不上效果最好的方法,...

2999
来自专栏北京马哥教育

40行代码的人脸识别实践

来源:Python开发 ID:PythonPush 前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的...

3858
来自专栏机器之心

教程 | 如何构建自定义人脸识别数据集

在接下来的几篇博文中,作者将带领大家训练一个「计算机视觉+深度学习」的模型来执行人脸识别任务。但是,要想训练出能够识别图像或视频流中人脸的模型,我们首先得收集人...

1052
来自专栏AI科技大本营的专栏

10行代码实现目标检测,请收下这份教程

作为人工智能的一个重要领域,计算机视觉是一门可以识别并理解图像和场景的计算机及软件系统科学。该领域主要包括图像识别,目标检测,图像生成,图像超分辨率等多个方向。...

771
来自专栏新智元

【AI可能真的要代替插画师了】复旦同济用cGAN生成动画人物

【新智元导读】复旦大学、同济、CMU等的研究者使用cGAN生成各种属性的二次元人物头像,效果非常令人印象深刻。生成的图片质量非常之高,本文作者认为这项工作如果加...

3035

使用Pandas进行数据分析

在您阅读这篇文章之前,您需要先了解以下内容:

1865
来自专栏CDA数据分析师

盘点丨2018 年热门 Python 库丨TOP20

在解决数据科学任务和挑战方面,Python继续处于领先地位。去年,我对当时热门的Python库进行了总结。今年,我在当中加入新的库,重新对2018年热门Pyth...

1382

扫码关注云+社区