Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

小程序码的生成和解析 #27

Open
CuriosityLxn opened this issue Jan 17, 2018 · 0 comments
Open

小程序码的生成和解析 #27

CuriosityLxn opened this issue Jan 17, 2018 · 0 comments

Comments

@CuriosityLxn
Copy link

CuriosityLxn commented Jan 17, 2018

题目:
小程序的二维码长得比普通二维码更好看一些,他是如何编码信息的呢?

阅读这篇文档:
https://my.oschina.net/u/3352375/blog/896956

请调查一下背后的原理。

如果你能自己写一个小程序码图片的解码器,可以达到大神级(五星)完成度,并获得额外奖励。

任务:
了解小程序码的原理

技能:
算法

任务难度:II

小程序码生成和识别
微信如何识别小程序码

总结:

小程序码和二维码的异同:
正是因为二维码可存储信息的多样性,在用户扫码之前会使用户迷惑,不知道自己扫到的是公众号,付款页面,好友请求还是其他什么。
但小程序码和普通二维码长得是不一样的,用户一看就知道扫码会进入一个微信小程序。
image

image

小程序码的生成:

1.定位
2.信息编码
3.加纠错码
4.加掩码
5.编码元信息
6.内侧轮廓填充
7.外侧边缘补全

小程序码的解码过程:

图片处理:

  • 简化为灰度图(忽略小程序码颜色)
  • 二值化,将大于某个临街灰度值的像素灰度设为灰度极大值,小于该临街灰度值的像素灰度设为灰度极小值,灰度图处理后变为位图(像素点)

定位:

  • 找出定位点:牛眼定位点比例:0.8:1.2:1.0,水平、竖直、倾斜45°角扫描全图,若三方向黑白像素比例都接近这个比例,则很大概率为定位点。
  • 定位官方logo:根据上面三个牛眼定位点预估logo位置,并根据圆形特性将预估点修正至圆心。
    修正方法:过预估点分别做一水平直线和一竖直直线,并作这两条直线与logo边缘割线的中垂线,中垂线交点即为logo圆心。
  • 摆正:通过透视变换,将其变换成直角坐标系的单位矩阵。
    前端中的矩阵变换
    矩阵变换原理

读码:

  • 借鉴条形码识别思路,使用“采样法”,采样每条放射线的像素序列,根据黑白比例读出每条线上的编码信息。

一个二维码识别器的小程序代码
生成的逻辑还没完全看懂,解码直接调用的微信的API。

微信扫码为什么那么快

扫码过程其实就是不断对焦、采集图像、识别的过程,而采集的帧数越少,代表扫码速度越快,可以理解为图形处理器每秒钟能够刷新几次。

【微信扫码的秘密:引擎+算法】
微信扫码使用了自家开发的QBar引擎,并计入了预判算法,在识别条码之前会过滤无码图像,只识别有意义的内容——二维码和条形码。
整个扫码预判模块位于核心识别引擎之前,不再需要对输入的视频中的每一帧图像进行检测识别,能实现快速过滤大量无码图像,减少后续不必要的定位和识别对扫码客户端造成的阻塞,使响应更加及时,增加扫码过程中的流畅度,而这就是微信扫码快速的关键原因。
QBar扫码引擎对二维码容错性解码算法、多语言字符检测算法等均使用进行了数十项优化,在识别率和识别速度上得到了提升。

在提高成功解码的概率上,微信的另一个做法就是给每个步骤做上“标签”,目的是找出错误信息,对失败信息再设置相应的二次检测流程,在失败的步骤处进行更”努力”地尝试,且越到后面的步骤,表明图中存在二维码的概率越大。
通过这样每步找错、多次识别解码,大大提高了手机扫描二维码的成功率。

微信团队分析数据显示,该引擎在识别正常图片时的解码速度,iOS可缩短至5毫秒,安卓也仅仅约12毫秒,当然这也和手机配置尤其是摄像头有很大关系。

普通二维码的生成与解析

@CuriosityLxn CuriosityLxn changed the title 与小程序码初过招 小程序码的生成和解析 Apr 16, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant