Python识别条形码

一维、二维、三维条码

一维二维都很常见了,三维条码还是第一次听说,不知是不是量子云码一类的。

网上摘抄了三维条码简介:

三维条码具有更大的信息容量、相同的识别便易性和较好的安全性。
三维码的主要特征在于利用色彩或灰度(或称黑密度)表示不同的数据并进行编码。

其实Python有条码扫描库,Python2一直都有一个很是出名,那就是zbar,但此库。虽然牛,却已经停止维护了,如果是python3,不能使用zbar库。

现在对于Python3来说使用比较多的是:pyzbar

安装pyzbar

pip install pyzbar

识读二维码

步骤1:

使用opencv2,初始化摄像头信息,调整摄像头识别图像的width和height。

import cv2
 
capture = cv2.VideoCapture(0)
 
# 摄像头设置,
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1024)
capture.set(cv2.CAP_PROP_EXPOSURE, 0.1)

步骤2:

测试cv2是否可以,调用摄像头识别图像,按esc退出

while True:
    # 读取摄像头中的图像,ok为是否读取成功的判断参数
    ret,img = capture.read()
    cv2.imshow('frame', img)
    k = cv2.waitKey(1)
    if k == 27:    # 'ESC'关闭
        break

步骤3:

识读条码

import cv2
import csv
import pyzbar.pyzbar as pyzbar   #条码识读模块
 
barcodeData1 = ''
 
found = set()
capture = cv2.VideoCapture(0)
 
# 摄像头设置
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1024)
capture.set(cv2.CAP_PROP_EXPOSURE, 0.1)
 
 
while True:
    # 读取摄像头中的图像,ok为是否读取成功的判断参数
    ret, frame = capture.read()
    # 转为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    barcodes = pyzbar.decode(gray)   # 识读条码
    print(barcodes)

如果识别出来条形码信息则打印如下:(为了方便观察添加了换行)

[
Decoded(
data=b’9787545152210’,
type=‘EAN13’,
rect=Rect(left=677, top=116, width=195, height=136),
polygon=[
Point(x=677, y=239),
Point(x=677, y=249),
Point(x=771, y=251),
Point(x=871, y=252),
Point(x=872, y=118),
Point(x=872, y=116),
Point(x=678, y=117)]
)]

上面的信息包含了data即条形码的值,还有就是Rect矩形区域即识别出的条形码的区域,以及识别的一些像素点。

如果没有识别出条形码信息,则打印出来的是空列表[ ]。

步骤4

上面代码中的barcodes返回的是一个列表信息,我们可以对列表信息进行遍历。获取条形码值,type类型和矩形区域。并使用cv2将上图所示的矩形绘制出来。

    for barcode in barcodes:
        # 提取条形码的边界框的位置
        (x, y, w, h) = barcode.rect
        # 画出图像中条形码的边界框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)

步骤5

data=b’9787545152210’是字节对象,此时我们需要将字节对象转成字符串。

        # 条形码数据为字节对象,所以如果我们想在输出图像上
        # 画出来,就需要先将它转换成字符串
        barcodeData = barcode.data.decode("utf-8")   # utf-8编码
        barcodeType = barcode.type

步骤6

读取商品信息表,判断识别出的条形码信息,是否在商品表中,为了避免扫描重复多次识别。使用了集合去重复条形码信息。

code_set = set() # 存放条形码的集合    # 避免重复读取        

if barcodeData not in code_set:            
	with open('shopping.csv', 'r') as rs:                
	reader = csv.reader(rs)                # 遍历超市库存文件                
	for line in reader:                    
		if barcodeData in line:  # 说明超市有这个商品                        
			print(f'本超市存在此商品,名称:{line[1]},价格:{line[3]}')                        
			break                    
		else:                        
			pass        
else:            
	pass   
	     
code_set.add(barcodeData)

步骤7

打开摄像头,如果按键是ESC则退出,识别系统

    cv2.imshow('qrcode+barcode', frame)    
    k = cv2.waitKey(1)    
    
    if k == 27:        
    	breakcv2.destroyAllWindows()

完整代码:

import cv2import csvimport pyzbar.pyzbar as pyzbarbarcodeData1 = ''code_set = set()capture = cv2.VideoCapture(0)# 摄像头设置capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1024)capture.set(cv2.CAP_PROP_EXPOSURE, 0.1)while True:    # 读取摄像头中的图像,ok为是否读取成功的判断参数    ret, frame = capture.read()    # 转为灰度图像    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)    barcodes = pyzbar.decode(gray)    print(barcodes)    for barcode in barcodes:        # 提取条形码的边界框的位置        # 画出图像中条形码的边界框        (x, y, w, h) = barcode.rect        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)        # 条形码数据为字节对象,所以如果我们想在输出图像上        # 画出来,就需要先将它转换成字符串        barcodeData = barcode.data.decode("utf-8")        barcodeType = barcode.type        # print(barcodeData)        # 判断多次扫描一个条形码,只打印一次        if barcodeData == '' or barcodeData != barcodeData1:            barcodeData1 = barcodeData            print("Recognize result>>> type: {0}  content: {1}".format(barcodeType, barcodeData))        else:            pass        # 避免重复读取        if barcodeData not in code_set:            with open('shopping.csv', 'r') as rs:                reader = csv.reader(rs)                # 遍历超市库存文件                for line in reader:                     if barcodeData in line:  # 说明超市有这个商品                        print(f'本超市存在此商品,名称:{line[1]},价格:{line[3]}')                        break                    else:                        pass        else:            pass        code_set.add(barcodeData)    cv2.imshow('qrcode+barcode', frame)    k = cv2.waitKey(1)    if k == 27:        breakcv2.destroyAllWindows()
	
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值