Dzwebs.Net

撰写电脑技术杂文十余年

python识别照片中的二维码和条形码

Admin | 2021-6-16 14:58:01 | 被阅次数 | 453

温馨提示!

如果未能解决您的问题,请点击搜索;登陆可复制文章,点击登陆

  下面给大家讲解的这两种代码,即能识别照片中的二维码,也能识别条形码。即两者通用,同样的代码,即能识别出这两种码。

  第一种代码:普通识别方法

  import pyzbar.pyzbar as pyzbar
  from PIL import Image,ImageEnhance

  img = Image.open(paperpicpath)#paperpicpath为图片地址

     img = img.crop((zb1[0],zb1[1], zb2[0], zb2[1])) #通过两个坐标先裁剪图像,把有码的大致范围裁剪下来。
     #img.show()
     #img = ImageEnhance.Brightness(img).enhance(2.0)#增加亮度
     #img = ImageEnhance.Sharpness(img).enhance(17.0)#锐利化
     #img = ImageEnhance.Contrast(img).enhance(4.0)#增加对比度
     img = img.convert('L')#灰度化
     qrcodereturntext='无法识别'

     texts = pyzbar.decode(img)
     if not texts:
         pass
     for text in texts:
         qrcodereturntext = text.data.decode("utf-8")
         if qrcodereturntext:
             print('二维码或条形码识别结果:',qrcodereturntext)
             pass

  参数qrcodereturntext就是最终的二维码或条形码识别的结果。

  该方法能够识别能力:贴二维码不倾斜或少倾斜就能识别通过,否则不一定能识别通过.

  第二种代码:通过调整图像二值化阈值

  import cv2 as cv
  import pyzbar.pyzbar as pyzbar

  myimg= cv.imread(paperpicpath)
  frame = myimg[zb1[1]:zb2[1], zb1[0]:zb2[0]]#裁剪图片的坐标,[858:995, 296:472]858:995为两个坐标点的纵坐标,296:472为两个坐标点的横坐标,小值的坐标在前.
  # 转为灰度图像
     gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
     barcodes = pyzbar.decode(gray)
     #这样识别率不高,为了提高识别率,可调整图像二值化阈值
     qrcodereturntext='无法识别' #定义并赋初值
     thre = 35 
     while (len(barcodes) == 0 and thre < 200):                  
         ret, thresh = cv.threshold(gray, thre, 255, cv.THRESH_BINARY)
         barcodes = pyzbar.decode(thresh)
         thre = thre + 10
     for barcode in barcodes:
         (x, y, w, h) = barcode.rect
         qrcodereturntext=barcode.data
  qrcodereturntext.decode('utf-8') #qrcodereturntext得到的是b类型的bytes字节数据,将其转换为字符
  print(qrcodereturntext)

  参数qrcodereturntext就是最终的二维码或条形码识别的结果。

  该方法不论二维码贴的是否倾斜,全部都能识别通过。


网站备案号:

网站备案号:滇ICP备11001339号-7

版权属性:

Copyright 2007-2021-forever Inc. all Rights Reserved.

联系方式:

Email:dzwebs@126.com QQ:83539231