?????????话不多说,先展示效果!
????????今天Franpper给大家带来的条形码与二维码识别,再开始识别之前,先生成一下今天所需要的测试图片。
????????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)
生成的条形码如下:?
????????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])
合并后如下:
?
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()
输出的图像如下:?
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开头展示的那样,这里就不在展示了。
????????关于条形码、二维码的生成与识别差不多就是这些了,大家一起动手试试吧!
?