二维码笔记系列(原文地址):

  • 『二维码学习笔记(一) | 二维码概述』
  • 『二维码学习笔记(二) | 数据分析与数据编码』
  • 『二维码学习笔记(三) | 纠错编码』
  • 『二维码学习笔记(四) | 信息构建与模块放置』
  • 『二维码学习笔记(五) | 数据掩码与版本信息』

唠唠闲话

二维码英文名称为 QR Code(Quick Response Code),是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型。二维码的出现,让我们的生活更加便捷,比如扫码登录,扫码支付,扫描骑车等等。

系列笔记将对二维码的理论知识进行总结,希望能够帮助大家更好的理解二维码的编码过程,笔记动机源于个人对编码理论的兴趣,以及今年参与的 OSPP-JuliaImages-项目。

本篇内容:

  • 二维码基本介绍
  • 编解码概述
  • 相关链接

二维码简介

版本和纠错等级

二维码的存储容量与其大小和纠错等级有关。二维码最小为 21 x 21,最大为 177 x 177,其大小也被称为“Version”,版本越高,能存储的信息也越多。

  1. 二维码版本,最小版本为 1,最大版本为 40

    版本号 二维码尺寸
    Version=1 21 x 21
    Version=2 25 x 25
    Version=k 17+4k x 17+4k
    Version=40 177 x 177
  2. 纠错等级:QR code 有 4 种纠错等级

    纠错等级 纠错能力
    Error Correction Level Error Correction Capability
    L(Low) 恢复 7% 的数据
    M(Medium) 恢复 15% 的数据
    Q(Quartile) 恢复 25% 的数据
    H(High) 恢复 30% 的数据
  3. 一般地,用 V-E 表示二维码版本信息,比如 40-L 表示版本为 40 纠错等级为 L 的二维码

基本构成

下图是版本 7 的二维码

其中深灰色区域存储二维码数据,其他区域用于图像定位以及记录版本信息等。具体地,非数据区域由以下几部分构成

  1. 功能区(Function Patterns),用于图像定位

    • 三个探测图形(Position Detection Patterns),分别位于左上,左下,右上,由黑白模块交错组成,如下图
    • 包围探测图形的分隔符(Separators for Postion Detection Patterns) 围绕探测图形的一圈白色模块
    • 时序图案(Timing Patterns),水平和竖直两条线段,作为标准线,用于图像校正
    • 对齐图案(Alignment Patterns),平均分布于图像各个位置,仅当二维码版本大于 1 时存在
    • 暗模块(Dark module) 位于白色分隔符直角的右侧
  2. 示例:下图黑白区域为功能区

  3. 编码区(Encoding Region),用于记录二维码信息

    • 格式信息(Format Information),分布在三个角落,存放二维码格式信息(纠错等级和掩码模式)

    • 版本信息(Version Information),只有版本号大于等于 7 的二维码存在,位于左下和右上的两块 3 x 6 的区域

    • 编码数据和纠错数据(Data and Error Correction Codewords)为余下的深灰色区域

注:二维码的三个编码区均具有一定的纠错能力,但当错误超过纠错上限时,二维码将无法识别。比如下图将版本信息置为白色,即使数据区域没有错误,二维码也无法识别。

█▀▀▀▀▀▀▀██▀▀▀▀█▀▀██▀▀▀█▀██▀▀▀▀▀▀███████▀▀▀▀▀▀▀█
█ █▀▀▀█ █▀▀▄██▀▀ █▀ ▀ ▄ ▄ ███▄▀█ ▄▄████ █▀▀▀█ █
█ █   █ █ ███▄█   ▀ ▀  ▀ ▀▄█▄█▀█▀█▀████ █   █ █
█ ▀▀▀▀▀ █ █▀█▀█ ▄ ▄▀█ █▀█ ▄▀▄▀█ █▀▄▀█▀█ ▀▀▀▀▀ █
█▀█▀▀▀▀▀█▄ ▄  █▄▄▀▀██ ▀▀▀   ▄▄▀ ▀▀▀▄ ▀█▀▀▀▀▀███
██  ▀█▄▀▄█   ▀▄ ▀ ▀▄ ▄▄█▄ ▄▀▄▀▀ ▀ ▀▀▀ ▄▀█ ▀ ▀▄█
█ ▀█▀ ▄▀▄██▄  ▀▄▀▄▀ ▀█▄█▄ ▄ ▄▀▄█▄█▄██ ▀█▄▀▀ █▀█
████▄█▀▀ █▀▄▄█▀ █▀█▀██▀ ▀▄▄▄▄ ▄▀▄█▄█▄█▀█▄ ▄█▀▀█
█▀▄▀▀██▀▄ ▄ █▀▄█ █▄ ▄ ▀▄▀█▀█▀█ █▀▄▀ ▄█▄ ▀█▄▀▀ █
██  ▄▀█▀ ▀▄▄  █ ▀▄ ▄ ▄█ ▄ ▀█▀█▄▄▀▀▀▄▄ ▄▄▀█▀ ▄██
█▀ ▄   ▀   █▀ ▀▀▀▄▀█▀▀▀▀  ▄ ▄▀▀ ▀▀▄█ ▀▀▀ ▀▀ ▄██
█ █▀▀ █▀█ ▄ █▄█▄█▀█ █ █▀█ ▄▄▄ ▀ ▀ ▄██ █▀█   ▀▀█
█▀▄█▀ ▀▀▀  ███▄██ ▄ █ ▀▀▀ █▄▄▄▄█▄██ ▀ ▀▀▀ ▄▄▀ █
█▀█▄▄▄█▀▄  ▀ ▀██▄▄▄ ▄  ▄█▄▄▀▄▀▄▀▄█▀▀█ ▄█▀ ▄█▀▄█
█▀ ▄▀  ▀ █▄   ▀  ▀▀██▄▀█▄ ▀█▀█▀ ▀▀▀ ▀▀▄▀▀ ▄▀▀ █
█▀█▀▀ █▀ ▄█▄▄▀ ▀▀ █ ▀▄█▀▄▀▀█▀█▀ ▀ ▀▄ █▀█▀█▀ ▄██
██ ▄▄█ ▀▀▄█▀▀█  █▀    ▄ ▄█▄ ▄▀█▀▀▄▄██▄▀ █▄▀ ▄██
██▄█▄▄▄▀█▀ █ ▄█▀███ █▀ █ ▀▄▄▄ ▄▄ █▄██ ▀ ▄█▄█▀▀█
███████▀██ ▀█▀▀   █▄█▀▀▀▀ ▀█▀█▄█▄█▀ ▄▀▀▀ ▀▄▀▀ █
█▀▀▀▀▀▀▀█▄   █▀███▄██ █▀█ ▀█▀█▄▀▄█▀▄▄ █▀█ ▄▀███
█ █▀▀▀█ █ ▄▀▄▀  ▄▀▄▄  ▀▀▀  █▄▄▀ ▀▀ ▄▄ ▀▀▀ ▄▄  █
█ █   █ █   ▀▀  █ ▀▀▀ ▄█▄ ▄▀██▀ ▀ ▀▀▀▄▀█▄▀▀ ▄██
█ ▀▀▀▀▀ █▀▀▄▀▄▀▀ ▄▄█▀▄ ▄▀▄▄ ▄▀▄█▄█▄█▀█▀█▄ ▀ ▀██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

由于 CSDN 不允许使用二维码,这里只能以文本形式显示


编码概述

总的来说,二维码拆分为功能区(探测图形,分隔符,时序图案,对齐图案和暗模块)和编码区(格式区(掩码+纠错),版本区数据区(编码+纠错)),按以下步骤填入二维码矩阵:

步骤 描述
数据分析 确定编码模式,纠错等级,版本
数据编码 将数据转换为二进制
纠错编码 生成纠错码并与原始数据交织构成数据区
构建二维码矩阵 功能区数据区填入矩阵
版本和掩码 将版本数据(若≥7)填入版本区;计算最佳掩码并处理数据区;最后将格式数据填入格式区

编码步骤

下边对编码步骤做进一步解释。

  1. 数据分析:根据数据内容确定编码模式,常见编码模式有:

    • 数字模式(Numeric mode)
    • 数字字母模式(Alphanumeric mode)
    • 字节模式(Byte mode) 和 UTF-8 字节模式(UTF8 mode)
    • 汉字模式(Kanji mode)
    • 扩充解释模式(ECI),结构链接模式,FNC1模式等(只关注前 4 种)
  2. 数据编码:根据纠错等级和编码模式计算最小版本,并按一定规则将数据转化为二进制(规则附后)

  3. 纠错编码:用 Reed-Solomon 纠错生成纠错位,并与编码数据交织得到数据位

  4. 构造矩阵:放置功能区(角落方块,放置对齐图案,时序图案和暗模块),将数据位填入矩阵:从右下出发,Z 字上下遍历数据区,参考下图(填充需跳过功能区,版本区和格式区,下图漏掉了版本区)

  5. 数据掩码:

    • 掩码处理是为了避免数据区出现类似定位器形状的区域,或者出现大片空白等,可能会使扫描器混淆、错乱

    • 掩码处理逆转某些模块(白色变成黑色,黑色变成白色),保留其他模块不变

    • 掩码只对数据区进行 XOR 运算,不会影响功能区,格式区和版本区

    • 二维码定义以下 8 种掩码方式,按评估条件选择罚分最低的方案

解码步骤

解码是编码的逆过程,包括以下步骤:

步骤 说明
检测和定位 通过图像计算,检测二维码位置,生成二维码矩阵
数据提取与纠错 检查二维码矩阵的完整性,提取数据并纠错
数据解码 将二进制数据转化为原始数据

下边对解码步骤做进一步解释。

  1. 检测和定位

    • 通过功能区(探测图形,时序图案和对齐图案),确定二维码位置和形变信息(涉及图像处理,重难点!)
    • 解码版本区(若版本≥7),检查与识别到的矩阵大小是否一致
  2. 提取数据,难点在 Reed-Solomon 的纠错

    • 解码格式区,获取纠错等级和掩码模式
    • 将掩码作用于数据区,还原原始数据
    • 提取数据区,纠错后返回原始编码数据
  3. 数据解码,重点在编码规则的选择

    • 根据模式指示器,获取编码模式
    • 按编码模式将二进制数据还原为字符串数据

相关链接

知识参考:

英文经典教程:QR Code Tutorial
二维码标准文献:ISO/IEC 18004:2000
维基百科:QR Code
CSDN 教程:二维码介绍
简书:为程序员写的 Reed-Solomon 码解释
CSDN 教程:二维码的生成细节和原理
知乎:二维码练习

编解码工具:

开源 ZXing:https://github.com/zxing/zxing
二维码生成器:https://zxing.appspot.com/generator
二维码解码器:https://zxing.org/w/decode.jspx
二维码解码器-2:https://www.onlinebarcodereader.com/

二维码学习笔记(一) | 二维码概述相关推荐

  1. Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)

    在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...

  2. Linux学习笔记(二) -- Linux学习笔记(二) – 解决VMware主窗口中的虚拟机窗口太小的方法

    1.问题描述 在虚拟机中安装完ubuntu操作系统后,我们会发现ubuntu界面在主窗口中占比很小,如下图所示: 这给操作带来了极大的不便. 2.解决步骤 1.在VMware中启动ubuntu系统: ...

  3. python源码笔记_python源码学习笔记(二)

    (二) python 继承和多态 这非常类似C++的功能,只不过是是在C基础上开发的.由上一节知,python的所有对象的基础都是PyObject,所以例如创建一个PyIntObject对象,是通过P ...

  4. nginx 源码学习笔记(二)——nginx精粹-模块

    看了一点nginx的源码发现,nginx的模块思想确实吸引了我,也不得不佩服俄罗斯人的想问题方式,要分析nginx源码,首先要搞懂的就是nginx的模块思想以及相关的数据结构. 还记得我们上一次写的h ...

  5. nginx 源码学习笔记(二十一)—— event 模块(二) ——事件驱动核心ngx_process_events_and_timers

    首先继续回忆下,之前子线程执行操作里面有一个未涉及的内容ngx_process_events_and_timers,今天我们就来研究下这个函数. 本篇文章来自于:http://blog.csdn.ne ...

  6. UE4引擎源码学习笔记(一):源码整体文件结构

    首先根据目录文件夹整体看一下结构,版本4.2 Binaries 里面是一些配置文件和第三方的配置文件,全部是xml,从这可以看到虚幻4都用了什么第三方工具,有各个平台的图形库,还有声音库,物理库(Ph ...

  7. 二维码学习笔记(二) | 数据分析与数据编码

    唠唠闲话 二维码笔记系列(原文地址): 『二维码学习笔记(一) | 二维码概述』 『二维码学习笔记(二) | 数据分析与数据编码』 『二维码学习笔记(三) | 纠错编码』 『二维码学习笔记(四) | ...

  8. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

  9. glibc-2.23学习笔记(二)—— free部分源码分析

    glibc-2.23学习笔记(二)-- free部分源码分析 _libc_free _int_free 函数定义 局部变量 start fast bins部分 unsorted bins部分 mmap ...

  10. 数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法

    数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法 一.概述: 提到特征点算法,首先就是大名鼎鼎的SIFT算法了.SIFT的全称是Scale Invariant Feature Transf ...

最新文章

  1. 修改服务器文件系统为xfs,CentOS Linux如何无损调整分区大小(XFS文件系统)
  2. 一次C端线上缓存问题的总结
  3. 23.2.3 高速缓存依赖性(1)
  4. 超级计算机预测南方下雪,今冬南方就不下雪了?超级计算机:可能性确实在减小,但还要观察...
  5. 从“中国听”到“听中国”!全球化下的音乐产业 迈向5G时代
  6. 【python】日志模块以及日志组件使用
  7. Matlab - Matlab 2016a 安装破解教程
  8. BUUCTF--[第二章 web进阶]死亡ping命令
  9. 无偏移谷歌瓦片地址_下载谷歌高清无偏移卫星地图
  10. 【Hulu独家面试宝典】助你决胜校招技术面
  11. 中小学计算机创新教育措施,小学信息技术教学论文计算机教学中的创新教育.docx...
  12. 汽车电器设备与维修【1】
  13. 买马桶哪个牌子的最好?
  14. RLC电阻电容电感基础知识——电容篇
  15. 如何进行产品定位(上)
  16. 亚马逊云科技的区域和可用区概念解释
  17. 数据库关系代数练习题
  18. 注意!吃蔬菜也有误区
  19. Milk Measurement
  20. matlab 信号生成,Matlab产生信号的方法

热门文章

  1. 树莓派的img文件怎样在vmware虚拟机里面打开
  2. 国家省、市、县、镇/街道地址
  3. HTML+CSS学习打卡第一周
  4. 传奇盗号木马清除手记(转)
  5. 将IFC模型转换为Revit模型后减肥
  6. 你想要的宏基因组-微生物组知识全在这(2020.10)
  7. JavaScript 教程,很好的!
  8. java中md5加密_JAVA中使用MD5加密实现密码加密
  9. LeetCode 2300. 咒语和药水的成功对数
  10. 使用 net C 发送邮件(带成功案例)