参考学习来自:OpenCV基础(25)条码和二维码扫的生成与识别
EAN-13是欧洲物品编码(European Article Number)的缩写,是一种广泛使用的条形码标准,特别是在超级市场和其它零售业中。以下是对EAN-13条形码的详细介绍:
一、基本信息
名称:EAN-13
全称:European Article Number
定义:一种用于表示终端产品信息的条形码协议和标准,由13位数字组成。
二、编码规则
国家代码:前3位数字表示国家代码,由国际商品条码总会授权。在 CN,可用的国家代码为690-699,其中696-699尚未使用。
厂商代码:接下来的4位数字表示厂商代码,由国家商品条码策进会核发给申请厂商。
产品代码:再接下来的5位数字表示产品代码,由厂商自由编定。
校验符:最后1位数字是校验符,用于检验前面12个数字的正确性。
三、校验符的计算方法
将12个数据符从左起将所有的奇数位相加得出一个数a。
将所有的偶数位相加得出一个数b。
将数b乘以3再与a相加得到数c。
用10减去数c的个位数,如果结果不为10则检验符为结果本身,如果为10则检验符为0。
from pystrich.ean13 import EAN13Encoder # pip install pystrich encode = EAN13Encoder('123456789123') encode.save('pystrich.png')
# pip install python-barcode from barcode.writer import ImageWriter from barcode.ean import EuropeanArticleNumber13 ean = EuropeanArticleNumber13("123456789123", writer=ImageWriter()) ean.save("barcode")
会默认保存为 barcode.png
from __future__ import print_function import pyzbar.pyzbar as pyzbar import numpy as np import cv2 def decode(im): # 查找条形码和二维码 decodedObjects = pyzbar.decode(im) # 打印结果 for obj in decodedObjects: print('Type : ', obj.type) print('Data : ', obj.data, '\n') return decodedObjects # 显示条码和二维码位置 def display(im, decodedObjects): # 遍历所有解码对象 for decodedObject in decodedObjects: points = decodedObject.polygon # 如果点不形成四边形,请找到凸包 if len(points) > 4: hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32)) hull = list(map(tuple, np.squeeze(hull))) else: hull = points # 凸包中的点数 n = len(hull) hull = [(int(x), int(y)) for x, y in hull] # 绘制凸包 for j in range(0, n): cv2.line(im, hull[j], hull[(j + 1) % n], (255, 0, 0), 3) # 显示结果 cv2.imwrite("Result.jpg", im) cv2.imshow("Results", im) cv2.waitKey(0) # 主函数 if __name__ == '__main__': # 读取图片 im = cv2.imread('barcode.png') # im = cv2.imread('pystrich.png') decodedObjects = decode(im) display(im, decodedObjects)
output
Type : EAN13 Data : b'1234567891231'
output
Type : EAN13 Data : b'1234567891231'