二维码识别并保存到MySQL数据库

一、程序说明

利用Python的第三方库OpenCv、pyZbar和PyMySQL,进行二维码信息识别,并将识别出来的二维码信息存入到数据库。

二、环境搭建(基于Python3、Ubuntu)

安装OpenCv:

sudo pip3 install opencv_python==3.4.2.16

安装pyzbar:

sudo pip3 install pyzbar

安装PyMySQL:

sudo pip3 install PyMySQL

三、准备工作

对于MySQL数据库的操作采用Navicat可视化工具,数据库为test,表为qrcode。

如图:

二维码识别并保存到MySQL数据库

附Navicat安装教程:https://blog.csdn.net/superit401/article/details/78110079/

解决Navicat中文乱码教程:https://blog.csdn.net/sinat_26546385/article/details/80381282

四、代码示例:

# coding=utf-8
import cv2
import pyzbar.pyzbar as pyzbar
import pymysql

# 定义标志,用来结束程序运行
flag = True

# 将二维码信息存入到MySQL数据库
def insert(type, data):

    # 定义全局变量
    global flag

    # 创建数据库连接对象
    conn = pymysql.connect(
        # 数据库的IP地址
        host="127.0.0.1",
        # 数据库用户名称
        user="root",
        # 数据库用户密码
        password="123456",
        # 数据库名称
        db="test",
        # 数据库端口名称
        port=3306,
        # 数据库的编码方式 注意是utf8
        charset="utf8"
    )

    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = conn.cursor()

    # SQL插入语句
    sql = "insert into qrcode(type,data) values(%s,%s)"
    try:
        # 执行sql语句
        if cursor.execute(sql, (type, data)) != -1:
            flag = False
        # 提交到数据库执行
        conn.commit()
    except Exception as e:
        # 如果发生错误则回滚并打印错误信息
        conn.rollback()
        print(e)

    # 关闭游标
    cursor.close()
    # 关闭数据库连接
    conn.close()


# 解析二维码
def decode(image):
    # 解析图像
    barcodes = pyzbar.decode(image)

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

        # 二维码类型
        barcodeType = barcode.type
        # 二维码数据
        barcodeData = barcode.data.decode("utf-8")

        # 将信息存入数据库
        insert(barcodeType, barcodeData)

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

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

    return image


# 调用摄像头识别二维码
def detect():
    # 调用内置摄像头
    camera = cv2.VideoCapture(0) # 参数0代表内置摄像头,参数1代表外置摄像头

    # 实时显示图像
    while flag:
        # 读取当前帧
        ret, frame = camera.read()  # ret:boolean值,表示是否正常打开摄像头  frame:获取当前帧图像
        # 转为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 调用解析函数
        img = decode(gray)

        # 按Q键退出程序
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        # 显示图像
        cv2.imshow("camera", img)

    # 释放摄像头资源
    camera.release()
    # 关闭显示图像的窗口
    cv2.destroyAllWindows()


# 主函数入口
if __name__ == '__main__':
    detect()

输出结果:

二维码识别并保存到MySQL数据库

Navicat显示结果:

二维码识别并保存到MySQL数据库