前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >万物互联 | 二维码的前世今生

万物互联 | 二维码的前世今生

原创
作者头像
redszhao
发布2023-03-02 18:16:31
1.7K0
发布2023-03-02 18:16:31
举报
文章被收录于专栏:北先生北先生

写在前面:

前段时间,基于“类付款码”的原理,通过手机二维码+人脸设备摄像头实现了IoT设备通信互联,有感兴趣的小伙伴可以私我交流一下,其中涉及了一些二维码的基础知识和底层原理,我们一起来看一下~

什么是二维码?

二维码又称二维条码,常见的二维码为QR Code(QR全称Quick Response),是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。(信息来源于百科词条

最初在1994年由日本DENSO WAVE公司腾弘原团队发明,后来DENSO WAVE 公司宣布,不行使本公司就标准QR码拥有的专利权(专利第2938338号),目前,QR码已经在国家标准和国际标准中实现标准化,任何人都可以随意查看该标准。

二维码的历史-条形码:

简介:

条形码或称条码(英语:barcode):是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。

发展:

进入上个世纪60年代之后,日本迎来的高速增长期,经销食品、衣料等种类繁多的商品的超市开始在城市中出现。

为了解决很多场景需要手动录入繁杂工作负担,条形码(一维码)运营而生,通过光感读取条形码,名称、价格等信息可以直接显示在出纳机(计算机)上,后被广泛应用于商业、邮政、图书管理、仓储、工业生产过程控制、交通等领域的一种自动识别技术,具有输入速度快、准确度高、成本低、可靠性强等优点,在当今的自动识别技术中占有重要的地位。

定义:

条形码-码制:

常用的一维码的码制(类型)包括:EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码,及Codabar(库德巴码)等。

EAN 码:是国际通用的符号体系,是一种长度固定、无含意的条码,所表达的信息全部为数字,主要应用于商品标识 39码和128码:为国内企业内部自定义码制,可以根据需要确定条码的长度和信息,它编码的信息可以是数字,也可以包含字母,主要应用于工业生产线领域、图书管理等。Code 39 码,是用途广泛的一种条形码,可表示数字、英文字母以及“?”、“.”、“/”、“+”、“%”、“$”、 “”(空格)和“*”共 44 个符号,其中“*”仅作为起始符和终止符。既能用数字,也能用 字母及有关符号表示信息。信息全部为数字,主要应用于商品标识。

93码:是一种类似于39码的条码,它的密度较高,能够替代39码。 25码:主要应用于包装、运输以及国际航空系统的机票顺序编号等。 Codabar码:应用于血库、图书馆、包裹等的跟踪管理。 ISBN:用于图书管理。

其他类型参考条形码-维基百科

条形码-结构:

一个完整的条码的组成次序依次为:静区(前)、起始符、数据符、(中间分割符,主要用于EAN码)、(校验符)、终止符、静区(后),如上图:

  • 静区:指条码左右两端外侧与空的反射率相同的限定区域,就是左右空白区,它能使阅读器进入准备阅读的状态,当两个条码相距距离较近时,静区则有助于对它们加以区分,静区的宽度通常应不小于6mm(或10倍模块宽度)。
  • 起始/终止符:指位于条码开始和结束的若干条与空,标志条码的开始和结束,同时提供了码制识别信息和阅读方向的信息。
  • 数据符:位于条码中间的条、空结构,它包含条码所表达的特定信息。
  • 校验字符:检验读取到的数据是否正确。不同编码规则可能会有不同的校验规则(部分条形码在数据字符和终止字符之间还有校验字符)
  • 模块:构成条码的基本单位是模块,模块是指条码中最窄的条或空,模块的宽度通常以mm或mil(千分之一英寸)为单位。构成条码的一个条或空称为一个单元,一个单元包含的模块数是由编码方式决定的。有些码制中,如EAN码,所有单元由一个或多个模块组成;而另一些码制,如39码中,所有单元只有两种宽度,即宽单元和窄单元,其中的窄单元即为一个模块。

条形码-识别原理:

要将按照一定规则编译出来的条形码转换成有意义的信息,需要经历扫描和译码两个过程。

(1)扫描过程:

物体的颜色是由其反射光的类型决定的,白色物体能反射各种波长可见光黑色物体则吸收各种波长可见光,所以当条形码扫描器光源发出的光在条形码上反射后,反射光照射到条码扫描器内部的光电转换器上,光电转换器根据强弱不同的反射光信号,转换成相应的电信号。根据原理的差异,扫描器可以分为光笔、CCD激光三种。电信号输出到条码扫描器的放大电路增强信号之后,再送到整形电路将模拟信号转换成数字信号。白条、黑条的宽度不同,相应的电信号持续时间长短也不同。

(2)译码过程:

译码器通过测量脉冲数字电信号0、1的数目来判别条和空的数目,通过测量0、1信号持续的时间来判别条和空的宽度。此时所得到的数据仍然是杂乱无章的,要知道条形码所包含的信息,则需根据对应的编码规则(例如:EAN-8码),将条形符号换成相应的数字、字符信息。最后,由计算机系统进行数据处理与管理,物品的详细信息便被识别了。

条形码-存在问题:

随着普及,新的问题出现:条形码的容量有限,英文数字最多只能容纳20个字符

有了新的诉求:

  • 编码本身要是能够含有更多的信息就好了
  • 希望具有汉字和假名的处理功能

当时负责QR码研发负责人,也就是二维码之父-原昌宏,思考:条形码只能横向(一维)存储信息,相比之下,如果能纵横排列,就可以容纳更多信息。并且要在这个基础上,做到便于读取。于是就有了后来的二维码。

二维码之父-原昌宏


二维码的种类

这里也叫做二维码的码制,常见的码制有:

QRCode、汉信码、PDF417二维条码(opens new window)、Datamatrix二维条码、Code 49、Code 16K、Code one等。样例如图所示:

二维码的特点

特点1-存储大容量信息:

传统的条形码只能处理20位左右的信息量,与此相比,QR码可处理条形码的几十倍到几百倍的信息量。

另外,QR码还可以支持所有类型的数据。(如:数字、英文字母、日文字母、汉字、符号、二进制、控制码等)。一个QR码最多可以处理7089字(仅用数字时)的巨大信息量。

特点2-支持小空间打印:

QR码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右。(还支持Micro QR码,可以在更小空间内处理数据。)

特点3-有效处理各种文字:

QR码是日本国产的二维码,因此非常适合处理日文字母和汉字。

QR码字集规格定义是按照日本标准“JIS第一级和第二级的汉字”制定的,因此在日语处理方面,每一个全角字母和汉字都用13比特的数据处理,效率较高,与其他二维码相比,可以多存储20%以上的信息。

特点4-容错率高,抗破损:

QR码具备“纠错功能”,即使部分编码变脏或破损,也可以恢复数据。数据恢复的单位是“码字”(是组成内部数据的单位,在QR码的情况下,每8比特代表1码字。) 根据变脏和破损程度的不同,也存在无法恢复的情况。

特点5-任意方向识别:

QR码从360°任一方向均可快速读取。原因在于QR码中的3处定位图案,可以帮助QR码不受背景样式的影响,实现快速稳定的读取。

特点6-支持数据合并功能:

QR码可以将数据分割为多个编码,最多支持16个QR码。使用这一功能,还可以在狭长区域内打印QR码。另外,也可以把多个分割编码合并为单个数据。

二维码的组成

二维码的版本和容量:

(1)什么是版本容量:

QR码设有1到40的不同版本(种类),每个版本都具备固有的码元结构(码元数)。(码元是指构成QR码的方形黑白点。)

“码元结构”是指二维码中的码元数。从版本1(21码元×21码元)开始,在纵向和横向各自以4码元为单位递增,一直到版本40(177码元×177码元)。

QR码的各个版本结合数据量、字符类型和纠错级别,均设有相对应的最多输入字符数。也就是说,如果增加数据量,则需要使用更多的码元来组成QR码,QR码就会变得更大。

(2)什么是纠错级别:

QR码具有“纠错功能”。即使编码变脏或破损,也可自动恢复数据。这一“纠错能力”具备4个级别,用户可根据使用环境选择相应的级别。调高级别,纠错能力也相应提高,但由于数据量会随之增加,编码尺寸也也会变大。

用户应综合考虑使用环境、编码尺寸等因素后选择相应的级别。 在工厂等容易沾染赃物的环境下,可以选择级别Q或H,在不那么脏的环境下,且数据量较多的时候,也可以选择级别L。一般情况下用户大多选择级别M(15%)

恢复率:相对比全部码字的比率

(3)纠错码原理:

纠错级别的比率,是指全部码字与可以纠错的码字的比率。 例如,需要编码的码字数据有100个,并且想对其中的一半,也就是50个码字进行纠错,则计算方法如下。纠错需要相当于码字2倍的符号(RS编码),因此在这种情况下的数量为50个×2=100码字。因此,全部码字数量为200个,其中用作纠错的码字为50个,所以计算得出,相对于全部码字的纠错率就是25%。这一比率相当于QR码纠错级别中的“Q”级别。

RS编码:QR码的纠错功能是通过将RS编码附加到原数据中的方式实现的。RS编码是应用于音乐CD等用途的数学纠错方法。它能以字节为单位进行纠错,适合用于错误位置会集中的突发错误。

(4)二维码版本选定:

例如,需要输入的数据为100位的数字时,通过以下步骤来选定。

1.假设要输入的数据种类为“数字” 2.从“L”“M”“Q”“H”中选择纠错级别。(假设选择“M”) 3.查看下表,先从数字列找出数字为100以上且接近100的,其次找出纠错级别“M”,两者交叉的部分就是最佳版本。

问题:面对不同混合字符的数据怎么办?参考:https://www.qrcode.com/zh/about/version.html

二维码的结构:

二维码结构图示意图

(1)位置探测图形、位置探测图形分隔符、定位图形:

用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异; 这三个定位图案有白边即位置探测图形分隔符,之所以三个而不是四个,因为三个就可以标识一个矩形了

(2)校正图形

规格确定,校正图形的数量和位置也就确定了,Version 2以上(包括Version2)的二维码才需要这个。

(3)格式信息

表示该二维码的纠错级别,分为L、M、Q、H,存在于所有的尺寸中,用于存放一些格式化数据的。

(4)版本信息

即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。

(5)数据和纠错码字

实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

二维码的原理:

1、二维码的编码过程:

二维码内容:123456

(1)添加位置探测图形

首先,先把位置探测图形图案画在三个角上。(无论Version如何,这个图案的尺寸就是这么大7*7)

(2)绘制校正图形( 5*5)

关于Alignment的位置,可以查看[QR Code Spec]的第81页的Table-E.1的定义表(下表是不完全表格)

下图是根据上述表格中的Version8的一个例子(6,24,42)

(3)绘制定位图形

接下来是定位图形的线。

再接下来是格式信息,下图中的蓝色部分。

格式信息是一个15个bits的信息,每一个bit的位置如下图所示:(注意图中的Dark Module,会永远出现)

这15个bits中包括:

  • 5个数据bits:其中,2个bits用于表示使用什么样的Error Correction Level, 3个bits表示使用什么样的Mask
  • 10个纠错bits。主要通过BCH Code来计算

然后15个bits还要与101010000010010做XOR操作。这样就保证不会因为我们选用了00的纠错级别和000的Mask,从而造成全部为白色,这会增加我们的扫描器的图像识别的困难。

(4)错误级别:

(5)添加版本信息

(版本7以后需要这个编码),下图中的蓝色部分。

版本信息 一共是18个bits,其中包括6个bits的版本号以及12个bits的纠错码,下面是一个示例

而其填充位置如下图:

(6)绘制数据和数据纠错码

然后是填接我们的最终编码,最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。

(7)转换为掩码图案

这样下来,我们的图就填好了,但是,也许那些点并不均衡,如果出现大面积的空白或黑块,会告诉我们扫描识别的困难。

所以,我们还要做Masking操作,有8个Mask你可以使用。如下所示:其中,各个mask的公式在各个图下面。所谓mask,就是和上面生成的图做XOR操作。Mask只会和数据区进行XOR,不会影响功能区。(注:选择一个合适的Mask也是有算法的)

下面是Mask后的一些样子,我们可以看到被某些Mask XOR了的数据变得比较零散了。

Mask过后的二维码就成最终的图了。

2、二维码的解码过程:

将上述编码过程反过来就是解码过程:

  1. 拿到版本信息、格式信息反向异或一次就可以得到原始信息
  2. 原始信息里包含掩码图案信息,将二维码和源码图案再做一次异或,就能得到原始二维码图案
  3. 去掉位置探测区域、校正区域等等所有功能图形,留下的部分就是源数据编码+纠错码+若干用于补齐的0
  4. 根据版本+纠错级别,可以知道源数据编码和纠错码分别有多长,以及交替顺序是怎样的
  5. 源数据编码的前 4 位表示编码模式,紧接着的 9 位表示原始字符串长度,根据版本+纠错级别也能知道随后的哪些表示源字符串的编码部分
  6. 根据编码模式解码得到源字符串

写在最后

参考文档:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面:
  • 什么是二维码?
  • 二维码的历史-条形码:
    • 简介:
      • 发展:
        • 条形码-码制:
          • 条形码-结构:
            • 条形码-识别原理:
              • (1)扫描过程:
              • (2)译码过程:
            • 条形码-存在问题:
            • 二维码的种类
            • 二维码的特点
              • 特点1-存储大容量信息:
                • 特点2-支持小空间打印:
                  • 特点3-有效处理各种文字:
                    • 特点4-容错率高,抗破损:
                      • 特点5-任意方向识别:
                        • 特点6-支持数据合并功能:
                        • 二维码的组成
                          • 二维码的版本和容量:
                            • (1)什么是版本容量:
                            • (2)什么是纠错级别:
                            • (3)纠错码原理:
                            • (4)二维码版本选定:
                          • 二维码的结构:
                          • 二维码的原理:
                            • 1、二维码的编码过程:
                              • (1)添加位置探测图形
                              • (4)错误级别:
                            • 2、二维码的解码过程:
                            • 写在最后
                              • 参考文档:
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                              http://www.vxiaotou.com