python学习——二维码生成和识别

二维码知识

在介绍二维码原理之前,先说下条形码 。条形码我们都见过,就是超市收银员结账的时候扫的那个东西。它是一种“一维码”,竖直方向,条码是均匀的,信息只能在水平方向上存储,并且只能由数字和字母组成。而二维码(现在常见的是QR Code,QR全称Quick Response)是一种比条形码更高级的条码格式,二维码在水平和垂直方向都能存储信息,并且二维码能存储汉字、数字和图片等信息,因此二维码的应用领域要广得多。

但是二维码是怎么生成的呢,我们知道,计算机只能识别0和1这两个数,所以要存储在二维码的信息,计算机会将这些字符都同一转变为0和1组成的二进制数字序列,这个转化的过程叫做编码。字符在变成只有0和1组成的数字序列后,在进行一系列优化算法后,就得到了最终的二进制编码。在最后这串编码中,一个0对应的就是一个白色小方块,一个1对应的就是一个黑色的小方块。我们把这些小方块按照8个一组,填进大方块里,这就是一个完整的,可以被手机相机识别的二维码图案了。

相比较于条形码,二维条码有一维条码没有的“定位点”和“容错机制”。不知大家有没有发现,所有的二维码都有三个小方块在边上。其实这三个方块是用来定位的,但为什么是三个呢,简单说就是三点确定一个面。如果只有一个点,经过这个点有无数个方框,两个点,有两个方框,因此就设了三个方块。所以不管你正着扫、倾斜扫、旋转180度扫,都能识别出来。”容错机制“就是在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。

了解了二维码的知识,下面就用python实现二维码的生成和识别

二维码的生成
首先要先安装pillow,qrcode库,在dos窗口输入:

pip install pillow
pip install qrcode

代码如下:


import qrcode as qrcode #导入qrcode包

# 二维码内容
data = "hello world"
# 生成二维码
img = qrcode.make(data=data)
# 直接显示二维码
img.show()
# 保存二维码为文件
img.save("hello.jpg")

运行后会出现一个二维码,并在文件的同目录下产生文件
下面代码设置二维码大小、颜色等参数来显示二维码

import qrcode as qrcode
qr = qrcode.QRCode(
    version=1, #二维码的格子矩阵大小
    error_correction=qrcode.constants.ERROR_CORRECT_Q,
    box_size=10,
    border=4,
)
qr.add_data("Hello World")#向二维码添加数据
qr.make(fit=True)
img = qr.make_image(fill_color="green", back_color="white")#更改QR的背景和绘画颜色
img.show()# 显示二维码

运行结果:在这里插入图片描述
二维码一共有 40 个尺寸。官方叫版本 Version。Version 1 是 21 x 21 的矩阵,Version 2 是 25 x 25 的矩阵,Version 3 是 29 的尺寸,每增加一个 version,就会增加 4 的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高 Version 40,(40-1)*4+21 = 177,所以最高是 177 x 177 的正方形。

具体的·一些参数详解可以看官方网址:
https://github.com/lincolnloop/python-qrcode#advanced-usage

二维码的识别
下面程序是预先给图片的识别

import cv2 as cv
from pyzbar import pyzbar as pyzbar

imagepath = r"./timg.jpg" #图片路径
image = cv.imread(imagepath)
img = cv.cvtColor(image,cv.COLOR_BGR2GRAY)#转为灰度图片
barcodes = pyzbar.decode(img) #在图像中对二维码解码
for barcode in barcodes:
        barcodeData = barcode.data.decode("UTF8")
        barcodeType = barcode.type
        # 打印二维码数据和二维码类型
        print( barcodeData)
        print(barcodeType)

下面程序打开电脑摄像头检测二维码并读取二维码内容

import cv2 as cv
from pyzbar import pyzbar as pyzbar


def decodeDisplay(image):
    barcodes = pyzbar.decode(image)
    for barcode in barcodes:
        # 提取二维码的边界框的位置
        # 画出图像中条形码的边界框
        (x, y, w, h) = barcode.rect
        cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

        # 提取二维码数据为字节对象,所以如果我们想在输出图像上
        # 画出来,就需要先将它转换成字符串
        barcodeData = barcode.data.decode("UTF8")
        barcodeType = barcode.type

        # 绘出图像上条形码的数据和条形码类型
        text = "{} ({})".format(barcodeData, barcodeType)
        cv.putText(image, text, (x, y - 10), cv.FONT_HERSHEY_SIMPLEX,.5, (0, 0, 125), 2)
        # 向终端打印条形码数据和条形码类型
        print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
    return image


def detect():
    camera = cv.VideoCapture(0)
    while True:
        # 读取当前帧
        ret, frame = camera.read()
        # 转为灰度图像
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        im = decodeDisplay(gray)
        c=cv.waitKey(5)#等待5毫秒
        cv.imshow("camera", im)
        if(c==27):#按下esc键关闭摄像头窗口
            camera.release()
            cv.destroyAllWindows()
            break

if __name__ == '__main__':
    detect()
  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值