会说话的读码器(Python实现)

会说话的读码器(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 # 编码器

设计思路

  1. 读取视频,并对每一帧进行处理,如果含有条形码或是二维码,用矩形框标识出来并识别内容;
  2. 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()

UI示例

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值