使用excel可以实现制作二维码,但只能实现做英文和数字类型的,步骤如下:
安装所使用的库
! pip install --user opencv-contrib-python
! pip install --user pyzbar
引入所用的库
import cv2
import numpy as np
from pyzbar.pyzbar import decode
使用decode函数对二维码的图片进行解码,会看到结果会出现以下一些参数。其中,data代表二维码的内容;type代表是条形码还是二维码类型;rect代表二维码轮廓的信息;polygon二维码轮廓的位置,从左上角逆时针旋转。
img = cv2.imread('code.png')
result = decode(img)
print(result)
结果为:
[Decoded(data=b’1230V’, type=‘QRCODE’, rect=Rect(left=34, top=33, width=193, height=187), polygon=[Point(x=34, y=33), Point(x=34, y=220), Point(x=227, y=220), Point(x=227, y=33)], quality=1, orientation=‘UP’)]
利用循环分别获取解码出来的信息:
for barCode in result:
print(barCode.data)
print(barCode.rect)
print(barCode.polygon)
结果为:
b’1230V’
Rect(left=34, top=33, width=193, height=187)
[Point(x=34, y=33), Point(x=34, y=220), Point(x=227, y=220), Point(x=227, y=33)]
发现会出现“ b’168Qr’ ”,b代表它是以字节为单位。想要去掉这个“b”,那么需要进行解码。
for barCode in result:
print(barCode.data)
myData = barCode.data.decode('utf-8')
print(myData)
运行结果如下:
b’1230V’
1230V
得出结论:解码成功
解码结束后,在图片上显示出二维码的位置和二维码的内容。
根据解码后的polygon返回值,框出二维码。
for barCode in result:
myData = barCode.data.decode('utf-8')
pts = np.array([barCode.polygon], np.int32) # 创建一个int32数据类型的二维码轮廓数组
pts = pts.reshape((-1, 1, 2)) # 自适应维度大小
cv2.polylines(img, [pts], True, (255, 0, 255), 5)
cv2.polylines():
cv2.polylines(img, pts, isClosed, color, thickness)
其中,pts: 折线顶点数组;isClosed:是否是闭合折线(多边形)
根据解码后的rect返回值,确定二维码内容放置的位置。
pts2 = barCode.rect
cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 255), 2)
cv.putText(img, text, org, fontFace,fontScale,color[, thickness[, lineType[, bottomLeftOrigin]]])
其中,参数依次为:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
先在当前文件夹内创建一个文本文件,里面输入一些授权的二维码内容。
with open('myDataList.txt') as f:
myDataList = f.read().splitlines()
print(myDataList)
根据二维码的内容来判断是否授权。如果二维码的内容在这个文本文件内,那么输出“Authorized”,而且框二维码的线条为绿色;如果二维码的内容不在这个文本文件内,那么输出“Un-Authorized”,而且框二维码的线条为红色。
for barCode in result:
myData = barCode.data.decode('utf-8')
if myData in myDataList:
myOutPut = "Authorized"
myColor = (0, 255, 0)
else:
myOutPut = "Un-Authorized"
myColor = (0, 0, 255)
pts = np.array([barCode.polygon], np.int32) # 创建一个int32数据类型的二维码轮廓数组
pts = pts.reshape((-1, 1, 2)) # 自适应维度大小
cv2.polylines(img, [pts], True, myColor, 5)
pts2 = barCode.rect
cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
cv2.imshow('22', img)
实现结果为:
import cv2
import numpy as np
from pyzbar.pyzbar import decode
img = cv2.imread('code.png')
result = decode(img)
with open('myDataList.txt') as f:
myDataList = f.read().splitlines()
print(myDataList)
for barCode in result:
myData = barCode.data.decode('utf-8')
if myData in myDataList:
myOutPut = "Authorized"
myColor = (0, 255, 0)
else:
myOutPut = "Un-Authorized"
myColor = (0, 0, 255)
pts = np.array([barCode.polygon], np.int32) # 创建一个int32数据类型的二维码轮廓数组
pts = pts.reshape((-1, 1, 2)) # 自适应维度大小
cv2.polylines(img, [pts], True, myColor, 5)
pts2 = barCode.rect
cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
cv2.imshow('22', img)
cv2.waitKey(0)
import cv2
import numpy as np
from pyzbar.pyzbar import decode
# 导入摄像头
cap = cv2.VideoCapture(0)
cap.set(3, 320) #摄像头的宽度
cap.set(4, 320) #摄像头的高度
cap.set(10, 100) #摄像头的亮度
with open('myDataList.txt') as f:
myDataList = f.read().splitlines()
while True:
success, img = cap.read()
for barcode in decode(img):
myData = barcode.data.decode('utf-8')
print(myData)
if myData in myDataList:
myOutPut = "Authorized"
myColor = (0, 255, 0)
else:
myOutPut = "Un-Authorized"
myColor = (0, 0, 255)
pts = np.array([barcode.polygon], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, myColor, 5)
pts2 = barcode.rect
cv2.putText(img, myOutPut, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
cv2.imshow("Result",img)
if cv2.waitKey(1) & 0xFF == ord('q'):
IMPLEX, 0.9, myColor, 2)
cv2.imshow("Result",img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
二维码检测与识别是计算机视觉领域中的一个重要任务,它旨在从图像或视频中检测、定位和解析出二维码信息。
在实现二维码检测与识别的过程中,我们可以借助开源工具库,如OpenCV和ZBar,利用图像处理、特征提取和分类器训练等技术来实现。