QR二维码
QR二维码1、QR码的简介2、QR码的结构2.1、QR码的特点2.2、QR二维码创建与识别
1、QR码的简介
QR码是二维条码的一种,QR 来自英文 “Quick Response” 的缩写,即快速反应的意思,源自发明者希望 QR 码可让其内容快速被解码。QR码不仅信息容量大、可靠性高、成本低,还可表示汉字及图像等多种文字信息、其保密防伪性强而且使用非常方便。更重要的是QR码这项技术是开源的。
2、QR码的结构
| 图片 | 解析 |
|---|---|
| 定位标识 (Positioning markings)标明二维码的方向。 | |
| 对齐标记 (Alignment markings)如果二维码很大,这些附加元素帮助定位。 | |
| 计算模式 (Timing pattern)通过这些线,扫描器可以识别矩阵有多大。 | |
| 版本信息 (Version information)这里指定正在使用的QR码的版本号,目前有QR码有40个不同的版本号。 用于销售行业的的版本号通常为1-7。 | |
| 格式信息 (Format information)格式模式包含关于容错和数据掩码模式的信息,并使得扫描代码更加容易。 | |
| 数据和错误校正值 (Data and error correction keys)这些模式保存实际数据。 | |
| 宁静区域 (Quiet zone)这个区域对于扫描器来说非常重要,它的作用就是将自身与周边的进行分离。 |
2.1、QR码的特点
QR码中数据值包含重复的信息(冗余值)。因此,即使多达30%的二维码结构被破坏,而不影响二维码的可读性。QR码的存储空间多达7089位或者是4296个字符,包括标点符号和特殊字符,都可以写入QR码中。除了数字和字符之外,还可以对单词和短语(例如网址)进行编码。随着更多的数据被添加到QR码,代码大小增加,代码结构变得更加复杂。
2.2、QR二维码创建与识别
源码路径:~/yahboomcar_ws/src/yahboomcar_visual/simple_qrcode
安装
python3 -m pip install qrcode pyzbar sudo apt-get install libzbar-dev
- 创建
创建qrcode对象
xxxxxxxxxx ''' 参数含义: version:值为1~40的整数,控制二维码的大小(最小值是1,是个12×12的矩阵)。 如果想让程序自动确定,将值设置为 None 并使用 fit 参数即可。 error_correction:控制二维码的错误纠正功能。可取值下列4个常量。 ERROR_CORRECT_L:大约7%或更少的错误能被纠正。 ERROR_CORRECT_M(默认):大约15%或更少的错误能被纠正。 ROR_CORRECT_H:大约30%或更少的错误能被纠正。 box_size:控制二维码中每个小格子包含的像素数。 border:控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值) ''' qr = qrcode . QRCode ( version = 1 , error_correction = qrcode . constants . ERROR_CORRECT_H , box_size = 5 , border = 4 ,)
qrcode二维码添加logo
xxxxxxxxxx # 如果logo地址存在,就添加logo图片 my_file = Path ( logo_path ) if my_file . is_file (): img = add_logo ( img , logo_path )
注意:使用中文时,需加中文字符
进入Docker:
x sh ~/ros_melodic.sh

启动程序:
xxxxxxxxxx cd ~/yahboomcar_ws/src/yahboomcar_visual/simple_qrcode python3 QRcode_Create.py

- 识别
xxxxxxxxxx def decodeDisplay ( image , font_path ): gray = cv . cvtColor ( image , cv . COLOR_BGR2GRAY ) # 需要先把输出的中文字符转换成Unicode编码形式 barcodes = pyzbar . decode ( gray ) for barcode in barcodes : # 提取二维码的边界框的位置 ( x , y , w , h ) = barcode . rect # 画出图像中条形码的边界框 cv . rectangle ( image , ( x , y ), ( x \+ w , y \+ h ), ( 225 , 0 , 0 ), 5 ) encoding = 'UTF-8' # 画出来,就需要先将它转换成字符串 barcodeData = barcode . data . decode ( encoding ) barcodeType = barcode . type # 绘出图像上数据和类型 pilimg = Image . fromarray ( image ) # 创建画笔 draw = ImageDraw . Draw ( pilimg ) # 参数1:字体文件路径,参数2:字体大小 fontStyle = ImageFont . truetype ( font_path , size = 12 , encoding = encoding ) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体 draw . text (( x , y \- 25 ), str ( barcode . data , encoding ), fill = ( 255 , 0 , 0 ), font = fontStyle ) # PIL图片转cv2 图片 image = cv . cvtColor ( np . array ( pilimg ), cv . COLOR_RGB2BGR ) # 向终端打印条形码数据和条形码类型 print ( "[INFO] Found {} barcode: {}" . format ( barcodeType , barcodeData )) return image
- 效果演示
需要进入Docker启动程序:
xxxxxxxxxx python3 QRcode_Parsing.py
