当前位置: 首页 > 工具软件 > python-qrcode > 使用案例 >

python 调用qrcode库实现二维码识别

漆雕和昶
2023-12-01

python 实现二维码识别ScanQRcode.py

"""
生成二维码保存及对二维码解码输出
运行需要安装相应库
"""
import os
import qrcode
from PIL import Image
from pyzbar import pyzbar


def createQRCode1(content, save_path=None):
    """
    创建二维码图片,并保存
    :param content:二维码文本信息
    :param save_path:二维码保存地址
    :return:
    """

    qr = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=8, border=4)
    qr.add_data(data=content)
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white")
    if save_path:
        img.save(save_path)
    else:
        img.show()


def createQRCode2(content, icon_path, save_path=None):
    """
    创建带中心图片的二维码,并保存
    :param content: 二维码文本信息
    :param icon_path: 中心图片地址
    :param save_path: 二维码保存地址
    :return: 无返回值
    """

    # 判断中心图片是否存在
    if not os.path.exists(icon_path):
        raise FileExistsError(icon_path)

    # 创建二维码图片
    qr = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4)
    qr.add_data(data=content)
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white").convert('RGBA')

    # 调整二维码图片
    icon_img = Image.open(icon_path)
    code_width, code_height = img.size
    icon_img = icon_img.resize(
        (code_width // 4, code_height // 4), Image.ANTIALIAS)

    img.paste(icon_img, (code_width * 3 // 8, code_width * 3 // 8))

    if save_path:
        img.save(save_path)  # 保存二维码图片
        img.show()  # 显示二维码图片
    else:
        print("save error!")


def decode_qr_code(code_img_path):
    """
    识别二维码,对二维码进行编译,返回值
    :param code_img_path: 二维码的保存地址
    :return: 二维码的编译结果
    """
    if not os.path.exists(code_img_path):
        raise FileExistsError(code_img_path)

    return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])


if __name__ == "__main__":
    print("============QRcodetest===============")
    print("         1、Make a QRcode            ")
    print("         2、Scan a QRcode            ")
    print("=====================================")
    print("1、请输入二维码存储信息:")
    code_Data = input('>>:').strip()
    print("正在编码·······")

    # createQRCode2(code_Data, "img/QRcenter.jpg", "qrcode.png")  # 内容,center图片,生成二维码图片
    createQRCode1(code_Data, "qrcode.png")
    print("图片已保存,名称为:qrcode.png")
    results = decode_qr_code("qrcode.png")
    print("2、正在解码:")
    if len(results):
        print("解码结果是:")
        print(results[0].data.decode("utf-8"))
    else:
        print("无法识别")

通过摄像头进行二维码识别ScanQRbyVedio

'''
================================
test4:识别摄像头中的条形码或二维码
(ps.仅识别二维码码成功)
================================
'''
import cv2
import pyzbar.pyzbar as pyzbar


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

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

        # 绘出图像上条形码的数据和条形码类型
        text = "{} ({})".format(barcodeData, barcodeType)
        cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,
                    .5, (225, 225, 225), 2)

        # 向终端打印条形码数据和条形码类型
        print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
    return image


def detect():
    camera = cv2.VideoCapture(0)

    while True:
        # 读取当前帧
        ret, frame = camera.read()
        # 转为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        im = decodeDisplay(gray)

        cv2.waitKey(5)
        cv2.imshow("camera", im)

        # 如果按键q则跳出本次循环
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    camera.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    detect()

 类似资料: