万物互联 | 二维码的前世今生(万物互联ioe)
 南窗  分类:IT技术  人气:95  回帖:0  发布于1年前 收藏

写在前面:

前段时间,基于“类付款码”的原理,通过手机二维码+人脸设备摄像头实现了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. 根据编码模式解码得到源字符串

写在最后

参考文档:

  • 维基百科,自由的百科全书-条形码
  • 微信支付二维码规范
  • https://www.qrcode.com/zh/about/
  • https://hellogithub2014.github.io/2019/08/05/qr-code-theory/
  • 草料二维码,在线生成二维码

讨论这个帖子(0)垃圾回帖将一律封号处理……