一维条码(Bar Code)
一维条码是由一组粗细不同、黑白(或彩色)相间的条、空及其相应的字符(数字字母)组成的标记,即传统条码。是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。
二维条码(QR Code,Quick Response Code)
二维条码简称为二维码,是用某站特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形。常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
三维条码
三维条码具有更大的信息容量、相同的识别便易性和较好的安全性。三维码的主要特征在于利用色彩或灰度(或称黑密度)表示不同的数据并进行编码。
二维条码有许多不同的码制,就码制的编码而言,通常分为三种类型:
矩阵式二维码
在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”。
邮政码
邮政码通过不同长度的条进行编码,主要用于邮件编码,如POSTNET、BPO4-STATE。
目前流形三大国际标准:
QR code与其他二维码相比,具有识读速度快,数据密度大,占用空间小的优势。
QR码呈正方形,常见的是黑白两色。在3个角落,印有较小,像“回”字的正方图案。这3个是帮助解码软件定位的图案,用户不需要对准,无论以任何角度扫描,资料仍然可以正确被读取。日本QR码的标准JIS X 0510在1999年1月发布,而其对应的ISO国际标准ISO/IEC18004,则在2000年6月获得批准。根据Denso Wave公司的网站资料,QR码是属于开放式的标准,QR码的规格公开,虽由Denso Wave公司持有的专利权益,但不会被运行。除了标准的QR码之外,也存在一种称为“微型QR码”的格式,是QR码标准的缩小版本,主要是为了无法处理较大型扫描的应用而设计。微型QR码同样有多种标准,最高可存储35个字符。
QR码最大特征为其左上,右上,左下三个大型的如同“回”字的黑白间同心方图案,为QR码识别定位标记,失去其中一个会影响识别。而呈棋盘般分布的有别与大定位标记的较小的同心方则为其校正标记,用于校正识别,版本1没有校正标记,版本2在右下方,其中心点在左下和右上定位标记的外边框的相交点,版本10开始以每个等距的方式出现在右下校正点至左下和右上定位标记的外边框的连线、左上与左下定位标记的外边框的连线、左上与右上定位标记的外边框的连线之间、这四边线上等距点对边相连线,版本10等距有1个,版本25为3个,版本40为5个。
位置探测图形、位置探测图形分隔符:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;这些黑白间隔的矩形块很容易进行图像处理的检测。
校正图形:根据尺寸的不同,矫正图形的个数也不同。矫正图形主要用于QR码形状的矫正,尤其是当QR码印刷在不平坦的面上,或者拍照时候发生畸变等。
定位图形:这些小的黑白相间的格子就好像坐标轴,在二维码上定义了网格。
格式信息:表示该二维码的纠错级别,分为L、M、Q、H;
数据区域:使用黑白的二进制网格编码内容。8个格子可以编码一个字节。
版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。
纠错码字:用于修正二维码损坏带来的错误。
QR码(英语:Quick Response Code;全称为快速响应矩阵图码)是二维码的一种,于1994年由日本DENSO WAVE公司发明。QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以快速解码其内容。QR码使用四种标准化编码模式(数字、字母数字、字节(二进制)和日文(Shift_JIS))来存储数据。QR码常见于日本,为目前日本最通用的二维空间条码,在世界各国广泛运用于手机读码操作。QR码比普通一维条码具有快速读取和更大的存储资料容量,也无需要像一维条码般在扫描时需要直线对准扫描仪。因此其应用范围已经扩展到包括产品跟踪,物品识别,文档管理,库存营销等方面。
QR码模型1是最早制作的QR码,最高版本为14(73x73码元),最多处理1167位数字。QR码的模型2是在模型1的改良版,它在二维码变形的情况下也能顺利读取数据。当二维码被打印在曲面上,或者由于读取角度等原因导致二维码变形时,仍然可以通过设置在二维码内部的对齐模式有效读取。最高版本为40(177x177码元),最多可以处理7089位数字。
Micro QR码只有一个定位图案,由于普通的QR码在3个角落上设置了定位图案,因此必须保证一定的尺寸。普通的QR码的边缘还必须留出至少4码元的空白,但Micro QR码的边缘只需要留出2码元的空白就足够了。Micro QR码可以在比QR码更小的空间内打印。
iQR码是可以简单读取二维码位置和大小的矩阵式二维码。使用iQR码,就能够生成出更为广泛的二维码,比如与普通的QR码以及Micro QR码相比尺寸更小的二维码,也可生成存储数据量更多的大型二维码等。此外,还可以制成长方形,支持内外翻转、黑白反色、圆点图案(直接打标在部件上),应用范围极其广泛。
尺寸小型化
iQR码可以生成比传统QR码更小的二维码,传统QR码的最小码元结构为纵向11码元x横向11码元,与此相比,iQR码最小的码元构成为纵向9码元x横向9码元,二维码的棉结缩小到传统QR码的60%左右。
长方形化
iQR码不仅可以生成正方形,还可以生成长方形。这样可以将打印条码的空间替换为iQR码,也可以打印在很难读取正方形码的圆筒状产品上。
大容量化
iQR码可以生成最大存储量比传统QR码更多的二维码。传统的QR码的最高版本(码元数为纵向177x横向177)能存储的数据量约为7000个字符,而iQR码的最高版本(码元数为纵向422x横向422)约可以存储40000个字符。(存储数据为数字)
高恢复率
iQR码具备了比传统QR码更高的二维码恢复功能。在二维码破损、脏污等的数据纠错级别方面,传统QR码最高可以纠正整体的30%,而iQR码的纠错功能高达50%。
iQR码有多种多样的码元结构。
正方形二维码的情况
采用正方形时,最小尺寸纵向9码元x横向9码元可以存储6位数字,最大尺寸纵向422码元x横向422码元则大约可以存储40000个字符。
长方形二维码的情况
采用长方形时,最小尺寸横向5码元×纵向19码元可以存储6位数字,最大尺寸横向43码元×纵向131码元则大约可存储1200个字符。
存储大量信息
传统的条形码只能处理20位左右的信息量,与此相比,QR码可以处理条形码的几十倍到几百倍的信息量。另外,QR码还可以支持所有类型的数据。如:数字、英文字母、日文字母、汉字、符号、二进制、控制码等。一个QR码最多可以处理7089字(仅用数字时)的巨大信息量。存储300位的英文字母和数组时,转换为QR码后只有这么小。
在小空间内打印
QR 码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右。还支持Micro QR码,可以在更小空间内处理数据。
可以有效地处理各种文字
QR码是日本国产的二维码,因此非常适合处理日文字母和汉字。QR码字集规格定义是按照日本标准“JIS第一级和第二级的汉字”制定的,因此在日语处理方面,每一个全角字母和汉字都用13比特的数据处理,效率较高,与其他二维码相比,可以存储20%以上的信息。
对变脏和破损的适应能力强
QR码具备“纠错功能”,即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位(在QR码的情况下,每8比特代表1码字),最多可以纠错约30%,根据变脏和破损程度的不同,也存在无法恢复的情况。
可以从360°任一方向读取
QR码从360°任一方向均可以快速读取,其3处定位图案,可以帮助QR码不受背景样的影响,实现快速稳定的读取。
支持数据合并功能
QR码可以将数据分割为多个编码,最多支持16个QR码。使用该功能可以在狭长区域内打印QR码。另外,也可以把多个分割编码合并为单个数据。
QR码设有1到40的不同版本(种类),每个版本都具备固有的码元结构(码元数)。码元是指构成QR码的方形黑白点。
码元结构是指二维码中的码元数。从版本1(21码元x21码元)开始,在纵向和横向各自以4码元为单位递增,一直到版本40(177码元x177码元)。
QR码的各个版本结合数据量、字符类型和纠错级别,均设有相对应的最多输入字符数。即如果增加数据量,则需要使用更多的码元来组成QR码,QR码就会变得更大。
如果需要输入的数据为100位的数字时,通过以下步骤来选定。
QR码具有“纠错功能”。即使编码变脏或破损,也可以自动恢复数据。该“纠错能力”局部4个级别,用户可以根据使用环境选择相应的级别。调高级别,纠错能力也相应提高,但由于数据量会随之增加,编码尺寸也会变大。应综合考虑使用环境、编码尺寸等因素后选择相应的级别。在工厂等容易沾染脏污的环境下,可以选择级别Q或H,在不那么脏的环境下,且数量较多的时候,也可以选择级别L。一般情况下大多选择级别M(15%)。
纠错功能的机制 纠错级别的比率,是指全部码字与可以纠错的码字的比率。例如,需要编码的码字数据有100个,并且想对其中的一半,即50个码字进行纠错,计算方法如下。纠错需要相当于码字2倍的符号(RS编码,QR码的纠错功能是通过将QR编码附加到原数据中的方式实现的。RS编码是应用于音乐CD等用途的数字纠错方法。它能以字节为单位进行纠错,适合用于错误位置会集中的突发错误。),因此在这种情况下的数量为50个x2=100码字。因此全部码字数量为200个,其中用作纠错的码字为50个,所以计算得出,相对于全部码字的纠错率就是25%。这一比率相当于QR码纠错级别中的“Q”级别。
另外,在上述例子中,也可以认为相对于码字数据的纠错率Wie50%,但变脏或破损的部位不仅仅局限于码字数据部分,因此,在QR码中,还是用相对于全部码字的比率来描述纠错率。
QR码系统可以分为两道工序,即QR码的制作和读取。QR码的制作是用“燃机和打印机”来实现,读取时使用“扫描仪和应用程序”。
码元大小的设定要点
在确定QR码版本后,还要确定以码元(构成QR码的一个方形图块)要以多少mm打印,码元大小不同,QR码的实际尺寸也会有所不同。
码元越大,QR码扫描仪就越容易读取。
码元大小应综合考虑用途之后确定,我们建议用户在打印范围内尽可能大地打印。
确定二维码范围时的要点
无法读取的情况举例
QR码在二维码的显示清晰且符合标准的情况下方可保证稳定读取。若QR码不符合标准或不清晰,有可能某种扫描仪或手机无法读取。
另外,不符合标准的二维码不能被称为QR码。
便携式扫描仪
手持读取二维码的扫描仪。
读取的数据可以通过数据线或无线方式传输到电脑中进行处理。
设备机型丰富多彩,例如有小型机型、轻质机型以及提高结构坚固性的机型等,还可以根据读取距离、分辨率等性能不同,或根据用途和使用场合不同选择最适合的机型。
手持终端
该终端不仅能读取二维码,还能对读取的数据进行存储以及计算等信息处理工作。便携式终端可安装Windows CE,也可安装开发商独自研发的操作系统。终端上可以安装各种应用程序,还具备数据通信功能,实现了更为广泛的应用范围。
固定式扫描仪
这种扫描仪可以嵌入在其他设备中,也可以安装在桌上使用。
读取的数据将通过数据线传输到连接的电脑中进行处理。
除了组装在入口闸门或工厂生产线上以外,还可以安装在普通商店以及活动会场等的桌上,用于读取优惠券、入场票等票务信息等。
在二维码发展到现在出现了很多变种,有彩色图片、动图、甚至非矩形的。这些变异二维码本质上与标准QR码原理一致,只是在编码排版上有所不同,因此生成和识别工具也不同。
微信小程序码也是一种异形码,是腾讯2017年1月为微信小程序专门设计的一种二维码式样。这种异形码并不是微信的首创,Facebook、Snap等公司都已经推出过类似的异形码。
传统二维码有以下缺点:
这种小程序码相比标准二维码有如下优点。
目前小程序码一共支持3种容量,分别是36射线、54射线和72射线。
每个版本分别对应L、M、Q、H 4种容错级别:
现阶段,当通过官方API文档去请求一张小程序码图片时,暂时不用指定期望生成的是哪种版本、哪个容错级别的小程序码,这些是微信后台会帮助开发者自动选择的。
小程序码生成的主要步骤。
信息编码区
编码的过程主要是把原始信息(例如某个小程序的首页)转化成计算机能够识别的语言-二进制序列的过程。
加纠错码不只是让数据量简单的增大,一旦小程序的版本、纠错级别确定了,其对应的纠错码都是固定的了,这样解码阶段才能通过对应的规则去消除纠错码,把真正有用的数据保留下来。
经过信息转换和纠错编码之后,得到一串最终的二维码序列,就可以把信息按一定的编码顺序填充到小程序码的编码区(1对应的是黑色,0对应的是白色)。填充之后小程序上花瓣看起来很不均匀,如下图所示。
为了让小程序码的花瓣看起来更加均衡,需要再多做一步操作。
逻辑异或(XOR,符号是⊕ )的基本知识,请看下面这个表格。
A ⊕ B ,当 AB 不等时值为 1,AB 相等时值为 0。A 和同一个 B 经过两次异或操作,结果跟原码相同(A ⊕ B ⊕ B = A)。
掩码操作
将小程序码跟 32 种掩膜(又称「mask」,可依照一定的规则生成)进行异或运算,最终选取效果最佳的作为最终的小程序码。
pyzbar安装
sudo apt-get install libzbar0
pip install pyzbar
#或者
python3.6 -m pip install pyzbar --user
from pyzbar import pyzbar
import os
import sys
import argparse
from pyzbar import pyzbar
from PIL import Image, ImageEnhance
import cv2
def parse_arguments(argv):
parser = argparse.ArgumentParser()
parser.add_argument('--image_dir', type=str, help='input image dir', default='/opt/buty/data/logo_data/test')
parser.add_argument('--save_path', type=str, help='save path', default='/opt/buty/data/logo_data/test_output')
return parser.parse_args(argv)
def main(args):
for img_name in os.listdir(args.image_dir):
#img = Image.open(os.path.join(args.image_dir, img_name))
#img = ImageEnhance.Brightness(img).enhance(2.0) # add brightness
#img = ImageEnhance.Sharpness(img).enhance(17.0) # add sharpness
#img = ImageEnhance.Contrast(img).enhance(4.0) # add constrast
#img_gray = img.convert('L') # gray
img = cv2.imread(os.path.join(args.image_dir, img_name))
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
barcodes = pyzbar.decode(img_gray)
for barcode in barcodes:
#location
(x, y, w, h) = barcode.rect
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
#decode
barcodeData = barcode.data.decode('utf-8')
barcodeType = barcode.type
text = '({}):{}'.format(barcodeType, barcodeData)
print(text)
cv2.putText(img, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.imwrite(os.path.join(args.save_path, img_name), img)
if __name__ == '__main__':
main(parse_arguments(sys.argv[1:]))
参考资料
pyzbar 0.1.8
NaturalHistoryMuseum/pyzbar
python3+pyzbar+Image 进行图片二维码识别
Python识别条形码(pyzbar)
pyzbar 二维码、条形码识别
Python制作二维码和条形码扫描器 (pyzbar)
基于opencv4.0 pyzbar和python实现二维码实时检测+定位
ZengWenJian123/qrcode_recognition
PhilS94/QR-Code-Scanner
Gbellport/QR-code-localization-YOLOv3
keefeWu/QRCode
yushulx/opencv-yolo-qr-detection
二维码学习(一):概念篇
Android OpenCV(四十):QR二维码检测与识别
二维码的生成细节和原理
QRCode二维码总结
QR 码的成功之路
什么是QR码?
痞子衡嵌入式:走进二维码(QR Code)的世界(1)- 引言
你一定不知道,小程序码是这样绽放的
[译]ISO/IEC 18004-2015 二维码标准文档(1)
《微信小程序开发文档》