【opencv有趣应用】二维码和条形码的检测

今天学习下使用opencv进行条形码和二维码的检测

import cv2
import numpy as np
from pyzbar.pyzbar import decode


def cv_show_image(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止
    cv2.destroyAllWindows()


def detect_draw_qrcode(img):
    img_temp = img.copy()
    # 返回的结果呢有很多信息啊,是个list,因为一张图可能有很多的 条形码或者二维码
    # data : 条形码或者二维码的真实信息
    # type : 条形码或者二维码的类型
    # rect : 条形码或者二维码的boundingbox的位置和长宽信息
    # polygon : 多边形的一些点的信息
    code = decode(img_temp)  # 进行检测
    print(code)  # 是个list

    # 分别解析其中的信息,这里是条形码
    for barcode in code:
        # 1: 打印其信息
        true_data = barcode.data.decode('utf-8')
        print(true_data)

        # 2: 在图上画出多边形的线条和点
        pts = np.array([barcode.polygon], np.int32)  # 转成array类型
        print(pts.shape)
        pts = pts.reshape((-1, 2))  # 转成array类型才方便reshape,因为后面的函数需要是array类型
        print(pts.shape)  # 不管有几个

        # 画出多边形的线,指定一堆的点,闭环,颜色是蓝色,粗细度是8
        cv2.polylines(img_temp, [pts], isClosed=True, color=(255, 0, 0), thickness=8)
        for point in pts:
            # 画出多边形的点。指定圆心和半径,半径是15,颜色是红色,粗细度是1
            cv2.circle(img=img_temp, center=point, radius=15, color=(0, 0, 255), thickness=1)

        # 3: 画出 bounding box,是个边界的矩形,颜色是绿色,粗细度是3
        (x, y, w, h) = barcode.rect
        cv2.rectangle(img_temp, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=3)

        # 4: 画出文字
        cv2.putText(img_temp, true_data, org=(x, y),
                    fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                    fontScale=0.7,
                    color=(0, 255, 0), thickness=3)

    cv_show_image('img_temp', img_temp)
    del img_temp

# ===================条形码
img = cv2.imread('images/qrcode1.jpeg')
detect_draw_qrcode(img)

# ===================二维码
img = cv2.imread('images/qrcode2.png')
detect_draw_qrcode(img)

# ==================摄像头,自己可以灵活拿来一些带有二维码/条形码
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if frame is None:
        print("camera is over...")
        break

    detect_draw_qrcode(frame)

    if cv2.waitKey(25) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

原图是:
请添加图片描述
请添加图片描述
检测后是:
请添加图片描述
请添加图片描述
以及开启摄像头后的效果:
请添加图片描述

猜你喜欢

转载自blog.csdn.net/qq_29367075/article/details/123452214