下面给大家讲解的这两种代码,即能识别照片中的二维码,也能识别条形码。即两者通用,同样的代码,即能识别出这两种码。
第一种代码:普通识别方法
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就是最终的二维码或条形码识别的结果。
该方法不论二维码贴的是否倾斜,全部都能识别通过。