OpenCV项目之二维码/条形码检测

2023-12-28 06:35:23

?????????话不多说,先展示效果!

????????今天Franpper给大家带来的条形码与二维码识别,再开始识别之前,先生成一下今天所需要的测试图片。

1、通过barcode库生成条形码

????????Barcode库是一个用于Python的库,它使得生成条形码变得简单。它支持多种条形码格式,包括常见的UPC、EAN、ISBN和QR码。

? ? ? ? 生成条形码的的方法如下:

from barcode.writer import ImageWriter
import barcode

code_save_dir = r'E:\pythonProject\OpenCV\opencv_proj\qrbartest'
barcode_path = os.path.join(code_save_dir, 'barcode')

# 创建条形码格式对象
EAN = barcode.get_barcode_class('code39')  # Barcode库支持多种条形码格式,根据需要选择适合的格式

message = "6920231218220"  # 条形码内容

# 创建条形码对象
ean = EAN(message, writer=ImageWriter())

# 保存条形码图片,并且返回路径
ean.save(barcode_path)

生成的条形码如下:?

2、 通过qrcode库生成二维码

????????qrcode是一个用于生成二维码的Python库。它简单易用,可以快速生成标准的二维码,同时还支持添加自定义颜色和嵌入图片。

code_save_dir = r'E:\pythonProject\OpenCV\opencv_proj\qrbartest'

qrcode_path = os.path.join(code_save_dir, 'qrcode.png')

qr_image = qrcode.make('https://franpper.blog.csdn.net/')
qr_image.save(qrcode_path)

生成的二维码如下:

将生成的二维码resize并于条形码水平拼接


bar_image = cv2.imread(os.path.join(code_save_dir, 'barcode.png'))
bar_h, bar_w, _ = bar_image.shape
qr_image = cv2.imread(os.path.join(code_save_dir, 'qrcode.png'))


resize_qr = cv2.resize(qr_image, (bar_h, bar_h))

merge_image = cv2.hconcat([resize_qr, bar_image])

合并后如下:

?

3、使用Pyzbar库进行识别

pyzbar的GitHub主页如下

GitHub - NaturalHistoryMuseum/pyzbar: Read one-dimensional barcodes and QR codes from Python 2 and 3.Read one-dimensional barcodes and QR codes from Python 2 and 3. - GitHub - NaturalHistoryMuseum/pyzbar: Read one-dimensional barcodes and QR codes from Python 2 and 3.icon-default.png?t=N7T8https://github.com/NaturalHistoryMuseum/pyzbar根据官方的介绍

具体的使用方法如下:

for code in decode(merge_image):
    data = code.data.decode('utf-8')  # 转为UTF-8 编码
    pts = np.array([code.polygon], np.int32)  # code.polygon 包含了识别到的条形码或二维码的多边形顶点坐标,将这些坐标转换为 NumPy 数组
    print(pts)
    pts = pts.reshape((-1, 1, 2))
    cv2.polylines(merge_image, [pts], True, (0, 255, 0), 5)  # 绘制外框
    code_box = code.rect
    # 将二维码或者条形码的的内容写在图中
    cv2.putText(merge_image, data, (code_box[0], code_box[3]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)

cv2.imshow('result', merge_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出的图像如下:?

4、使用摄像头进行识别

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


cap = cv2.VideoCapture(1)
cap.set(3, 640)
cap.set(4, 480)

while True:
    success, frame = cap.read()
    if success:
        for code in decode(frame):
            data = code.data.decode('utf-8')

            pts = np.array([code.polygon], np.int32)
            print(pts)
            pts = pts.reshape((-1, 1, 2))

            cv2.polylines(frame, [pts], True, (0, 255, 0), 5)

            code_box = code.rect
            cv2.putText(frame, data, (code_box[0], code_box[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
        cv2.imshow('result', frame)
        cv2.waitKey(1)


????????识别之后的效果正如Franpper开头展示的那样,这里就不在展示了。

????????关于条形码、二维码的生成与识别差不多就是这些了,大家一起动手试试吧!

?

文章来源:https://blog.csdn.net/weixin_58283091/article/details/134843134
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。