当前位置:   article > 正文

利用Python生成和识读二维码(QR Code)和微二维码(Micro QR Code)

micro qr code


之前写的一篇 博客采用了segno库来做微二维码的生成,该库可以方便的生成微二维码micro code图像,但是不能解析微二维码。时隔一年,今天发现有一个开源免费的 BoofCV库已经可以生成和解析micro code了,将相关方案记录在此。

为了能够统一,本教程将普通二维码的生成和解析内容也一并进行讲解。本教程基于python来实现,因此,需要提前安装好python环境。操作系统可以是windows10或ubuntu20.04。

一、环境准备

安装pyboof和opencv-python:

pip install pyboof -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/
  • 1
  • 2

二、二维码(QR Code)生成和读取

2.1 生成二维码

创建一个python文件,内容如下:

import pyboof as pb
import cv2

# 创建生成器
generator = pb.QrCodeGenerator(pixels_per_module=20)

# 创建需要编码的字符
generator.set_message("0123456789ABCD")

# 生成图像
img = generator.generate()
img = pb.boof_to_ndarray(img)

# 保存图像
cv2.imwrite('result.png',img)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行上述代码后在本地会生成一个二维码。

2.2 读取二维码

创建一个python文件,内容如下:

import numpy as np
import pyboof as pb

# 读取图像
img = pb.load_single_band("1.jpg", np.uint8)

# 创建解码器
detector = pb.FactoryFiducial(np.uint8).qrcode()

# 检测并解码
detector.detect(img)

# 展示解码结果
print("检测到 {} 个QR码".format(len(detector.detections)))
for qr in detector.detections:
    print("Message: " + qr.message)
    print("     at: " + str(qr.bounds))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里注意,不要解析前面生成的二维码,因为前面生成的二维码尺度太大了,占据整个图像了,对于BoofCV这个库来说在这个尺度下检测不到二维码。我们需要把这个图像放在一张大图中,让整个二维码显得比较小,这样才能让BoofCV库检测到。

运行上述代码后,结果如下:

检测到 1 个QR码
Message: 0123456789ABCD
     at: Polygon2D( (202.95778572848613,69.95778572848613) (278.5026022893253,70.00376126941202) (278.501265272895,145.50371751295154) (202.95099575255398,145.50208580290834) )
  • 1
  • 2
  • 3

可以看到同时返回了解析结果和二维码坐标。

三、微二维码(Micro QR Code)生成和读取

3.1 生成微二维码

创建一个python文件,内容如下:

import pyboof as pb
import cv2

# 创建生成器
generator = pb.MicroQrCodeGenerator(pixels_per_module=20)

# 创建需要编码的字符
generator.set_message("0123456789ABCD")

# 生成图像
img = generator.generate()
img = pb.boof_to_ndarray(img)

# 保存图像
cv2.imwrite('result.png',img)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行上述代码后在本地会生成一个微二维码,如下图所示:
在这里插入图片描述

3.2 读取微二维码

创建一个python文件,内容如下:

import numpy as np
import pyboof as pb

# 读取图像
img = pb.load_single_band("2.jpg", np.uint8)

# 创建解码器
detector = pb.FactoryFiducial(np.uint8).microqr()

# 检测并解码
detector.detect(img)

# 展示解码结果
print("检测到 {} 个QR码".format(len(detector.detections)))
for qr in detector.detections:
    print("Message: " + qr.message)
    print("     at: " + str(qr.bounds))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里注意,不要解析前面生成的微二维码,因为前面生成的微二维码尺度太大了,占据整个图像了,对于BoofCV这个库来说在这个尺度下检测不到微二维码。我们需要把这个图像放在一张大图中,让整个二维码显得比较小,这样才能让BoofCV库检测到:

运行上述代码后,结果如下:

检测到 1 个QR码
Message: 0123456789ABCD
     at: Polygon2D( (243.98930004010995,304.96718170239785) (385.6505340346546,304.9659491152183) (385.7300808033455,446.7159802279783) (243.96721802160135,446.8599454752604) )
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/680540
推荐阅读
相关标签
  

闽ICP备14008679号