用python识别条形码,二维码并且定位标注

    xiaoxiao2022-07-02  161

     

    原理很简单用OpenCV处理图片pyzbar识别条形码

       python里面有一个包pyzbar可以用识别二维码和条形码,我们再结合OpenCV处理图片的功能就可以标注出二维码位置内容

      我们生活中的常见的带有二维码和条形码的图片如下图

    需要导的包有

    import pyzbar.pyzbar as pyzbar import numpy from PIL import Image, ImageDraw, ImageFont import cv2

    首先用OpenCV读取图片处理图片

    frame= cv2.imread('样本图.jpg') # 转为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    灰度后的图像就可以给pyzbar解码了

    barcodes = pyzbar.decode(gray)

     打印一下barcodes

    [Decoded(data=b'http://weibo.com/u/3225432640', type='QRCODE', rect=Rect(left=451, top=246, width=119, height=119), polygon=[Point(x=451, y=364), Point(x=570, y=365), Point(x=566, y=247), Point(x=453, y=246)]), Decoded(data=b'6925303773908', type='EAN13', rect=Rect(left=70, top=214, width=217, height=134), polygon=[Point(x=70, y=313), Point(x=70, y=345), Point(x=173, y=347), Point(x=286, y=348), Point(x=287, y=308), Point(x=287, y=214), Point(x=72, y=215), Point(x=71, y=247)])]

    可以看出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 # 把cv2格式的图片转成PIL格式的图片然后在上标注二维码和条形码的内容 img_PIL = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) # 参数(字体,默认大小) font = ImageFont.truetype('STFANGSO.TTF', 25) # 字体颜色 fillColor = (0,255,0) # 文字输出位置 position = (x, y-25) # 输出内容 strl = barcodeData # 需要先把输出的中文字符转换成Unicode编码形式(str.decode("utf-8)) # 创建画笔 draw = ImageDraw.Draw(img_PIL) draw.text(position, strl, font=font,fill=fillColor) # 使用PIL中的save方法保存图片到本地 img_PIL.save('结果图.jpg', 'jpeg') # 向终端打印条形码数据和条形码类型 print("扫描结果==》 类别: {0} 内容: {1}".format(barcodeType, barcodeData))

    打印结果

    扫描结果==》 类别: QRCODE 内容: http://weibo.com/u/3225432640 扫描结果==》 类别: EAN13 内容: 6925303773908

     

    最新回复(0)