基于Python的二维码实验
一、机器视觉之QRcode
二、基于Python的QRcodetest
(一)配置环境
(二)生成自己的二维码
(三)识别二维码
三、调用opencv库摄像头识别图像
(一)用opencv找出(条形码&二维码)位置
(二)调用解码函数进行解码
一、机器视觉之QRcode
问:什么是QRcode呢?
答:二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它能将数字、英文字母、汉字、日文字母、特殊符号(如空格,%,/ 等)、二进制等信息记录到一个正方形的图片中。
因此,在转换的过程中,离不开编码压缩方式。在许多种类的二维条码中,常用的码制有:Data Matrix,Maxi Code,Aztec,QR Code,Vericode,PDF417,Ultracode,Code 49,Code 16K等。
二维码在现实生活中的应用越来与普遍,归功于 QR code 码制的流行。我们常说的二维码就是它,所以,二维码又被称为 QR code。
QR code 是一种矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
我们的目的是要使用 Python 生成 QR 码,那我们需要先了解二维码(QR 码)的结构。根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:
二维码的绘制大概过程如下:
在二维码的左上角、左下角、右上角绘制位置探测图形,位置探测图形一定是一个 7x7 的矩阵;
(1)绘制校正图形,校正图形一定是一个 5x5 的矩阵;
(2)绘制两条连接三个位置探测图形的定位图形;
(3)在上述图片的基础上,继续绘制格式信息;
(4)接着绘制版本信息;
(5)填充数据码和纠错码到二维码图中;
(6)最后绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积空白或黑块的情况,导致扫描识别十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。在这一步,我们可以将数据排列成各种图片。
问:主要运用qrcode库文件、这是个什么东东呢?
答: 这里给一篇博客有详细叙述:Python生成二维码
开源库import qrcode具体使用方法:
编码:
#原始二维码编码
import qrcode
img = qrcode.make('helloworld')
#带图片的编码方式
qr = qrcode.QRCode(
version=5,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=8,
border=4)
1
2
3
4
5
6
7
8
9
解码:
#调用decode()的解码函数
def decode_qr_code(code_img_path):
if not os.path.exists(code_img_path):
raise FileExistsError(code_img_path)
# Here, set only recognize QR Code and ignore other type of code
return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])
1
2
3
4
5
6
二、基于Python的QRcodetest
环境:python3.7+zbar+qrcode
(一)配置环境
打开cmd、pip分别安装以下库文件:(zxing也是一个强大的二维码开源库文件,建议安装)
pip install opencv-python
pip install numpy
pip install pillow
pip install myqr
pip install qrcode
pip install zxing
1
2
3
4
5
6
tips:记得安装完成后,如果是eclipse要重新启动一次才能加载进来
(二)生成自己的二维码
1 MyQr制作gif二维码:
同目录下放置一张gif格式图片
源码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from MyQR import myqr
myqr.run(
# 在命令后输入链接或者句子作为参数,然后在程序的当前目录中产生相应的二维码图片文件,默认命名为“qrcode.png”
words='helloworld',
version=1, # 设置容错率为最高默认边长是取决于你输入的信息的长度和使用的纠错等级;而默认纠错等级是最高级的H
level='H', # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
picture='test.gif', # 用来将QR码图像与一张同目录下的图片相结合,产生一张黑白图片,格式可以是.jpg, .png, .bmp, .gif
colorized=True, # 可以使产生的图片由黑白(False)变为彩色(True)的
contrast=1.0, # 用以调节图片的对比度,1.0 表示原始图片,更小的值表示更低对比度,更大反之。默认为1.0。
brightness=1.0, # 用来调节图片的亮度
)
1
2
3
4
5
6
7
8
9
10
11
12
13
2 qrcode制作带图片的二维码:
新建工程QRcodeTest;新建PyDev包,命名为MakeMyQRcode:
因为我想做出一个漂亮简单一点的code,所以首先在目录文件下贴入一张图片,命名为QRcodeCenter,like this(左:成果图,右:准备中心图片):
————————————————
版权声明:本文为CSDN博主「cungudafa」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cungudafa/article/details/85871871
===========================
''' ============================== test1:生成二维码及查看 ============================== ''' from PIL import Image import qrcode qr = qrcode.QRCode( version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4) qr.add_data("这里是二维码信息!") qr.make(fit=True) img = qr.make_image() img = img.convert("RGBA") icon = Image.open("f:/a.jpg") # 这里是二维码中心的图片 img_w, img_h = img.size factor = 4 size_w = int(img_w / factor) size_h = int(img_h / factor) print(str(size_w)+":"+str(img_w)) icon_w, icon_h = icon.size if icon_w > size_w: icon_w = size_w if icon_h > size_h: icon_h = size_h print("icon_h:"+str(icon_h)) icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS) w = int((img_w - icon_w) / 2) h = int((img_h - icon_h) / 2) print("w:"+str(w)) print("h:"+str(h)) icon = icon.convert("RGBA") img.paste(icon, (w, h), icon) img.show() # 显示图片,可以通过save保存 img.save("f:/1.png")
# -*- coding:utf-8 -*- ''' ==================================== test2:生成二维码保存及对二维码解码输出 ==================================== ''' import os import qrcode from PIL import Image from pyzbar import pyzbar import arcpy def make_qr_code(content, save_path=None): qr_code_maker = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=8, border=4, ) qr_code_maker.add_data(data=content) qr_code_maker.make(fit=True) img = qr_code_maker.make_image(fill_color="black", back_color="white") if save_path: img.save(save_path) else: img.show() # 中间图不显示 def make_qr_code_with_icon(content, icon_path, save_path=None): if not os.path.exists(icon_path): raise FileExistsError(icon_path) # First, generate an usual QR Code image qr_code_maker = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4, ) qr_code_maker.add_data(data=content) qr_code_maker.make(fit=True) qr_code_img = qr_code_maker.make_image( fill_color="black", back_color="white").convert('RGBA') # Second, load icon image and resize it icon_img = Image.open(icon_path) code_width, code_height = qr_code_img.size icon_img = icon_img.resize( (code_width // 4, code_height // 4), Image.ANTIALIAS) # Last, add the icon to original QR Code qr_code_img.paste(icon_img, (code_width * 3 // 8, code_width * 3 // 8)) if save_path: qr_code_img.save(save_path) # 保存二维码图片 qr_code_img.show() # 显示二维码图片 else: print("save error!") def decode_qr_code(code_img_path): if not os.path.exists(code_img_path): raise FileExistsError(code_img_path) # Here, set only recognize QR Code and ignore other type of code return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE]) if __name__ == "__main__": inTable = arcpy.GetParameterAsText(0) nrField = arcpy.GetParameterAsText(1) print("============QRcodetest===============") print(" 1、Make a QRcode ") print(" 2、Scan a QRcode ") print("=====================================") print("1、请输入编码信息:") code_Data = input('>>:').strip() print("正在编码:") # ==生成带中心图片的二维码 make_qr_code_with_icon( code_Data, "f:/a.jpg", "f:/qrcode.png") # 内容,center图片,生成二维码图片 print("图片已保存,名称为:qrcode.png") results = decode_qr_code("f:/qrcode.png") print("2、正在解码:") if len(results): print("解码结果是:") print(results[0].data.decode("utf-8")) else: print("Can not recognize.")