【opencv】生成二维码并识别

  • 生成二维码
  • 图片识别
  • 摄像头识别


生成二维码

import qrcode #模块导入
#调用qrcode的make()方法传入url或者想要展示的内容
img = qrcode.make('http://www.baidu.com')
#写入文件
with open('test.png', 'wb') as f:
    img.save(f)
    
    
    
'''
此处并没有使用add_data()添加数据,make_image()生成二维码,而是使用qrcode.make(data)的方式获取im对象。qrcode.make()是qrcode提供简单调用接口。

- 2. 正常生成二维码的步骤:
创建QRCode对象
add_data()添加数据
make_image()创建二维码(返回im类型的图片对象)
自动打开图片,im.show()
- 3. QRCode参数详细说明:
version: 一个整数,范围为1到40,表示二维码的大小(最小值是1,是个12×12的矩阵),如果想让程序自动生成,将值设置为 None 并使用 fit=True 参数即可。
error_correction: 二维码的纠错范围,可以选择4个常量:
··1. ERROR_CORRECT_L 7%以下的错误会被纠正
··2. ERROR_CORRECT_M (default) 15%以下的错误会被纠正
··3. ERROR_CORRECT_Q 25 %以下的错误会被纠正
··4. ERROR_CORRECT_H. 30%以下的错误会被纠正
boxsize: 每个点(方块)中的像素个数
border: 二维码距图像外围边框距离,默认为4,而且相关规定最小为4

'''
'''
import qrcode

data = 'http://www.baidu.com/'
img_file = r'保存路径'

# 实例化QRCode生成qr对象
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4
)
# 传入数据
qr.add_data(data)

qr.make(fit=True)

# 生成二维码
img = qr.make_image()

# 保存二维码
img.save(img_file)
# 展示二维码
img.show()
    
'''    

'''
利用PIL库中image模块的paste函数
img.paste(path,where,mask=None)
其中,img为image对象;path为所添加图片;where为tuple,如:(x,y),表示图片所在二维码的横纵坐标

'''
'''
import qrcode
from PIL import Image
import matplotlib.pyplot as plt


def getQRcode(data, file_name):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=5,
        border=4,
    )

    # 添加数据
    qr.add_data(data)
    # 填充数据
    qr.make(fit=True)
    # 生成图片
    img = qr.make_image(fill_color="green", back_color="white")

    # 添加logo,打开logo照片
    icon = Image.open("1.jpg")
    # 获取图片的宽高
    img_w, img_h = img.size
    # 参数设置logo的大小
    factor = 6
    size_w = int(img_w / factor)
    size_h = int(img_h / factor)
    icon_w, icon_h = icon.size
    if icon_w > size_w:
        icon_w = size_w
    if icon_h > size_h:
        icon_h = size_h
    # 重新设置logo的尺寸
    icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
    # 得到画图的x,y坐标,居中显示
    w = int((img_w - icon_w) / 2)
    h = int((img_h - icon_h) / 2)
    # 黏贴logo照
    img.paste(icon, (w, h), mask=None)
    # 终端显示图片
    plt.imshow(img)
    plt.show()
    # 保存img
    img.save(file_name)
    return img


if __name__ == '__main__':
    getQRcode("世情薄,人情恶,雨送黄昏花易落。晓风干,泪痕残,欲笺心事,独语斜阑。"
              "难,难,难!人成各,今非昨,病魂常似秋千索。角声寒,夜阑珊,怕人寻问,咽泪装欢。瞒,瞒,瞒!", 'my.png')
'''


图片识别

import cv2
import numpy as np
from pyzbar.pyzbar import decode
 
img = cv2.imread('test.png')#识别图片中二维码
for barcode in decode(img):
    print(barcode.data)
    myData = barcode.data.decode('utf-8')
    print(myData)
    pts = np.array([barcode.polygon],np.int32)
    pts = pts.reshape((-1,1,2))
    cv2.polylines(img,[pts],True,(255,0,255),5)#圈框
    pts2 = barcode.rect
    cv2.putText(img,myData,(pts2[0],pts2[1]),cv2.FONT_HERSHEY_SIMPLEX,0.9,(255,0,255),2)#标字
 
cv2.imshow('Result',img)
cv2.waitKey(0)

摄像头识别

import cv2
import numpy as np
from pyzbar.pyzbar import decode
 
#img = cv2.imread('1.png')#识别图片中二维码
cap = cv2.VideoCapture(0)#使用摄像头识别
cap.set(3,640)
cap.set(4,480)
 
while True:
    success, img = cap.read()
    for barcode in decode(img):
        print(barcode.data)
        myData = barcode.data.decode('utf-8')
        print(myData)
        pts = np.array([barcode.polygon],np.int32)
        pts = pts.reshape((-1,1,2))
        cv2.polylines(img,[pts],True,(255,0,255),5)#圈框
        pts2 = barcode.rect
        cv2.putText(img,myData,(pts2[0],pts2[1]),cv2.FONT_HERSHEY_SIMPLEX,
    0.9,(255,0,255),2)#标字
     
    cv2.imshow('Result',img)
    cv2.waitKey(1)