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

 

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

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

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

用python识别条形码,二维码并且定位标注_第1张图片

需要导的包有

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)

用python识别条形码,二维码并且定位标注_第2张图片

灰度后的图像就可以给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))

用python识别条形码,二维码并且定位标注_第3张图片

打印结果

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

 

你可能感兴趣的:(python,opencv,pyzbar)