话不多说,先展示效果!
今天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主页如下
具体的使用方法如下:
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开头展示的那样,这里就不在展示了。
关于条形码、二维码的生成与识别差不多就是这些了,大家一起动手试试吧!