基于Tesseract的OCR识别
功能描述
通过读取摄像头采集的图像,进行OCR(光学字符识别),包括中文,英文,数字等
模块功能
import tkinter as tk # UI模块
from tkinter import ttk # UI模块
import cv2 # 图像处理模块
from PIL import ImageTk,Image # 图像处理模块
import pytesseract # OCR识别模块
import datetime # 时间模块
设计思路
代码实现
class Myapp(object):
def __init__(self):
self.video_flag = 0
self.shot_flag = 0
self.re_img = None
self.cap = cv2.VideoCapture(0)
self.root = tk.Tk()
self.root.title('基于Tesseract的OCR识别')
self.func_frame = ttk.LabelFrame(self.root, text='功能选择')
self.bt_style = ttk.Style()
self.bt_style.configure('bt_style',font=('黑体',20))
self.bt_test = tk.Button(self.func_frame, text='自检',font=('仿宋', 15), command=self.video_init)
self.bt_start = tk.Button(self.func_frame, text='打开',font=('仿宋', 15), command=self.open)
self.bt_shot = tk.Button(self.func_frame, text='拍照',font=('仿宋', 15), command = self.shot)
self.bt_recog = tk.Button(self.func_frame, text='识别',font=('仿宋', 15), command=self.recog)
self.bt_stop = tk.Button(self.func_frame, text='关闭',font=('仿宋', 15), command=self.stop)
self.bt_test. grid(row=0, column=0,padx=5)
self.bt_start .grid(row=0, column=1,padx=5)
self.bt_shot .grid(row=0, column=2,padx=5)
self.bt_recog .grid(row=0, column=3,padx=5)
self.bt_stop .grid(row=0, column=4,padx=5)
self.func_frame.pack(pady=4)
self.show_frame = ttk.LabelFrame(self.root, text='视图区')
self.lb_video = tk.Label(self.show_frame, text='视频显示', bg='gray',compound=tk.CENTER, fg='red', font=('仿宋',20))
self.lb_image = tk.Label(self.show_frame, text='图片抓取', bg='gray',compound=tk.CENTER, fg='red', font=('仿宋',20))
self.lb_video.grid(row=0, column=0,padx=10)
# self.lb_image.grid(row=0, column=1,padx=2)
self.info_frame = tk.Frame(self.root)
self.recog_frame = ttk.LabelFrame(self.info_frame,text='识别内容')
self.scr_recog= tk.Scrollbar(self.recog_frame)
self.tt_recog = tk.Text(self.recog_frame,width=50,height=10)
self.scr_recog.pack(side=tk.RIGHT, fill=tk.Y)
self.tt_recog. pack(side=tk.LEFT,fill=tk.Y)
self.scr_recog.config(command=self.tt_recog.yview)
self.tt_recog.config(yscrollcommand=self.scr_recog.set)
self.recog_frame.grid(row=0,column=1,padx=10)
self.log_frame = ttk.LabelFrame(self.info_frame, text='运行日志')
self.tt_log = tk.Text(self.log_frame, width=50, height=10)
self.scr_log = tk.Scrollbar(self.log_frame)
self.tt_log.pack(side=tk.LEFT,fill=tk.Y)
self.scr_log.pack(side=tk.RIGHT,fill=tk.Y)
self.scr_log.config(command=self.tt_log.yview)
self.tt_log.config(yscrollcommand=self.scr_log.set)
self.log_frame.grid(row=0,column=0,padx=10)
self.info_frame.pack()
self.root.mainloop()
def video(self):
ret, frame = self.cap.read()
img = Image.fromarray(frame)
img = ImageTk.PhotoImage(img)
self.lb_video.imgtk = img
self.lb_video.config(image=img)
self.lb_video.after(1, self.video)
if self.video_flag == 1:
self.show_frame.pack(pady=4)
elif self.video_flag == 0:
self.show_frame.pack_forget()
if self.shot_flag == 1:
self.re_img = frame
self.lb_image.imgtk = img
self.lb_image.config(image=img)
self.lb_image.grid(row=0, column=1, padx=10)
self.shot_flag = 0
def video_init(self):
if self.cap.isOpened():
self.video()
self.bt_test.config(state=tk.DISABLED)
self.tt_log.insert('0.0', f'相机连接成功\n')
def open(self):
self.video_flag = 1
self.tt_log.insert('0.0', f'打开相机\n')
def stop(self):
self.video_flag = 0
self.tt_log.insert('0.0', f'关闭相机\n')
def shot(self):
self.shot_flag = 1
self.tt_log.insert('0.0', f'图片采集\n')
def recog(self):
self.tt_recog.delete('0.0', tk.END)
data = pytesseract.image_to_string(self.re_img, lang='eng+chi_sim')
self.tt_log.insert('0.0', f'内容识别{datetime.datetime.now()}\n')
self.tt_recog.insert('0.0', data.replace(' ',''))
# print(data.replace(' ',''))
if __name__ == '__main__':
Myapp()