本文主要使用pyzbar 與pylibdmtx來讀取條碼,並用靜態方法將這兩個套件的讀碼功能包裝起來,因應不同需求,調用相對應的方法來讀取QR code,一維條碼,Data Matrix。最後再將讀到的條碼資料與框選條碼位子於原圖上。
[Python基礎]裝飾器staticmethod 定義靜態方法
以下是使用 pyzbar
來讀取一維條碼和 QR Code,並使用 pylibdmtx.pylibdmtx
來讀取 Datamatrix 的內容。
確保你已經安裝了所需的 Python 套件
pip install opencv-python
pip install pyzbar
pip install pylibdmtx
將條碼讀取功能進行封裝,並根據不同條碼類型調用不同函式。
使用 pyzbar
來讀取一維條碼和 QR Code
使用 pylibdmtx.pylibdmtx
來讀取 Datamatrix
import cv2
import numpy as np
from pyzbar.pyzbar import decode as pyzbar_decode
import pylibdmtx.pylibdmtx
class BarcodeReader:
@staticmethod
def read_img(path):
img = cv2.imdecode(np.fromfile(file=path, dtype=np.uint8), cv2.IMREAD_COLOR)
return img
@staticmethod
def read_qr_and_1d(image):
"""使用 pyzbar 來讀取 QR Code 和一維條碼"""
barcodes = pyzbar_decode(image)
for barcode in barcodes:
x, y, w, h = barcode.rect
# 畫框顯示條碼位置
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 條碼資訊
barcode_data = barcode.data.decode('utf-8')
# 顯示條碼資訊在影像上
text = f'{barcode_data}'
cv2.putText(image, text, (x, y-3), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
return barcode_data,image
@staticmethod
def read_datamatrix(image):
"""使用 pylibdmtx 來讀取 Datamatrix 條碼"""
barcodes = pylibdmtx.pylibdmtx.decode(image)
results =[]
if barcodes:
results = barcodes[0][0].decode('utf-8')
for barcode in barcodes:
x, y, w, h = barcode.rect.left, barcode.rect.top, barcode.rect.width, barcode.rect.height
# 畫框顯示條碼位置
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 顯示條碼資訊在影像上
text = f'Datamatrix: {results} '
cv2.putText(image, results, (x, y-3), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
return results,image
@staticmethod
def show_image(image):
"""顯示處理後的影像"""
cv2.imshow('Barcode Reader', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 使用範例
if __name__ == "__main__":
# 調用read_img讀圖
QR_Code_img = BarcodeReader.read_img('PATH')
Data_Matrix_Code_img = BarcodeReader.read_img('PATH')
Code_128_img = BarcodeReader.read_img('PATH')
# 調用read_qr_and_1d讀取 QR 和一維條碼
qr_code_results, QR_Code_res_img = BarcodeReader.read_qr_and_1d(QR_Code_img)
print("QR Code : ", qr_code_results)
Code_128_1d_results, Data_Matrix_Code_res_img = BarcodeReader.read_qr_and_1d(Code_128_img)
print("1D Barcodes: ", Code_128_1d_results)
# 用read_datamatrix讀取 Datamatrix
Data_Matrix_results, Data_Matrix_res_img = BarcodeReader.read_datamatrix(Data_Matrix_Code_img)
print("Datamatrix: ", Data_Matrix_results)
# 顯示處理後的影像
show_image(QR_Code_res_img)
show_image(Data_Matrix_Code_res_img)
show_image(Data_Matrix_res_img)