会说话的读码器(Python实现)
功能描述
实时读取视频中的一维码或二维码,并语音播报。还支持编码
模块功能
import threading # 多线程任务
import tkinter as tk # UI视图
import cv2 # 图像处理
import pyttsx3 # 文本转语音处理
import pyzbar.pyzbar as pyzbar # 条形码、二维码处理
import winsound # 系统警报音效
from PIL import Image,ImageTk # 图片格式转换
from pystrich.code128 import Code128Encoder # 编码器
设计思路
- 读取视频,并对每一帧进行处理,如果含有条形码或是二维码,用矩形框标识出来并识别内容;
- UI界面,显示视频,获取识别内容,编码。
代码实现
import threading
import tkinter as tk
import cv2
import pyttsx3
import pyzbar.pyzbar as pyzbar
import winsound
from PIL import Image,ImageTk
from pystrich.code128 import Code128Encoder
# 定义全局变量
info = None
data = None
# 读取视频,识别条码或二维码,矩形框标注,识别类型和内容
def video():
global data, info
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
barcodes = pyzbar.decode(gray)
# print(barcodes)
for barcode in barcodes:
data = barcode.data.decode()
barcodeType = barcode.type
# 矩形框标注
(x, y, w, h) = barcode.rect
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
if info != data:
print(f'type:{barcodeType}data:{data}, info:{info}')
info = data
tt.delete(0.0, tk.END)
tt.insert(0.0, info + '\n')
threading.Thread(target=beep).start()
img = ImageTk.PhotoImage(Image.fromarray(frame))
# print(img)
lb['image'] = img
lb.image = img
# cv2.imshow('Code scanner', frame)
if cv2.waitKey(5) == 27:
break
cap.release()
print(cap.isOpened())
cv2.destroyAllWindows()
# 语音播报,并发出系统提示音(警报音,通过音)、
def beep():
global data, info
winsound.Beep(1000, 500)
msg = tt.get(0.0, tk.END)
engine.say(msg)
try:
engine.runAndWait()
except RuntimeError:
print(f'data:{data}, info:{info}')
winsound.Beep(2000, 500)
data = 'Runing'
# 生成指定的码
def encode():
msg = tt.get(0.0, tk.END)
code = Code128Encoder(msg)
code.save(r'code.png')
# 开启视频线程
threading.Thread(target=video).start()
# 初始化语音播报
engine = pyttsx3.init()
# 设置语音播报速率
engine.setProperty('rate', 150)
# 初始化UI界面
root = tk.Tk()
root.title('会说话的读码器(含编码)')
tk.Button(root, text='编码器', command=encode).pack()
tt = tk.Text(root,width=80,height=10)
lb = tk.Label(root)
tt.pack()
lb.pack()
root.mainloop()