📜  使用Python的名片扫描仪 GUI 应用程序

📅  最后修改于: 2022-05-13 01:54:54.370000             🧑  作者: Mango

使用Python的名片扫描仪 GUI 应用程序

Python是一种新兴的编程语言,由许多内置模块和库组成。它为许多 Web 和敏捷应用程序提供支持。由于其简洁简洁的语法行为,许多大型知名组织如 Instagram、Netflix 等都在Python工作框架中工作,并朝着巨大的增长迈进。在本文中,我们将使用 Tkinter 构建用于扫描名片的 GUI 应用程序。

Tkinter 是一个非常强大且用户友好的工具包,因为它为用户提供了修改其行为和 Tkinter 库中可用小部件属性的完全控制权。由于 Tkinter 提供了面向对象的工作框架,因此它是一种更好的应用程序编程方式。 Tkinter 中的面向对象接口满足 DRY(不要重复自己)原则,有助于减少代码冗余。

需要 Py 库:

  • Tkinter 库
  • Pytesseract 库
  • 枕头图书馆
  • 操作系统模块

上述库的介绍:

  • Pytesseract 库: Pytesseract 是一个基于 ICR(智能字符识别)和 OCR(光学字符识别)的工具包,可在Python中使用。它是谷歌的包装工具,可以“提取”“读取”任何图像中的嵌入文本。首先,使用此处提供的 tesseract 设置在您的系统上安装并运行 Pytesseract。从上面的 Github 链接安装应用程序后,在 shell 上安装 pytesseract
pip install pytesseract
  • Pillow 库:它是一个免费的开源库,可用于Python中的图像处理(操作、打开和关闭各种文件格式,即 jpeg/png)。
pip install Pillow
  • os模块:它是一个交互模块,处理程序和操作系统之间的文件事务。 os.path 实用模块提供了文件共享的功能。

程序方法:

  • 首先,我们将使用 Tkinter 中可用的各种小部件和属性(如标签、按钮、框架等)创建一个界面,即 GUI。
  • 创建基本布局后,我们现在准备通过实现其主要功能(即上传文件然后转换文件)来使其具有响应性。
  • 文件对话框逻辑将在此处起作用,以便可以将格式正确的图像上传到软件。
  • 成功上传后,系统现在已准备好进行转换,现在Pytesseract模块角色开始发挥作用。 Pytesseract 模块将从图像中读取和提取嵌入的文本,并将使用转换后的文本更新文本区域。
  • 此外, Python中的文件处理方法将使用转换后的文本创建并附加一个文本文件,并将其存储在我们系统的本地数据库中。
  • 将来可以访问存储的文件以获取信息和验证。

下面是完整的实现:

Python3
# Visiting Card scanner GUI
  
# imported tkinter library
from tkinter import *
import tkinter.messagebox as tmsg    
  
# Pillow library for importing images
from PIL import Image, ImageTk
  
# library for filedialog (For file selection)
from tkinter import filedialog
  
# Pytesseract module importing
import pytesseract        
import os.path
  
root = Tk()
  
# fixing geometry of GUI
root.geometry('800x500')        
root.maxsize(1000, 500)
root.minsize(600, 500)
root.title('Visiting card scanner')
  
# function for uploading file to GUI
def upload_file():        
    global filename
    global start, last
    filename = filedialog.askopenfilename(
        initialdir='/Desktop', title = 'Select a card image',
      filetypes=(('jpeg files', '*.jpg'), ('png files', '*.png')))
      
    if filename == '':
        t.delete(1.0, END)
        t.insert(1.0, 'You have not provided any image to convert')
        tmsg.showwarning(
            title = 'Alert!', message = 'Please provide proper formatted image')
        return
        
    else:
        p_label_var.set('Image uploaded successfully')
        l.config(fg='#0CDD19')
      
    if filename.endswith('.JPG') or filename.endswith('.JPEG') or filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.PNG') or filename.endswith('.png'):
        filename_rev = filename[::-1]
        last = filename.index('.')
        start = len(filename) - filename_rev.index('/') - 1
  
# function for conversion
def convert():        
    try:
        c_label_var.set('Output...')
        pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract'
        text = pytesseract.image_to_string(filename)
        t.delete(1.0, END)
        t.insert(1.0, text)
        root1 = Toplevel()
        root1.title('Uploaded image')
        img1 = ImageTk.PhotoImage(Image.open(filename))
        Label(root1, image=img1).pack()
        root1.mainloop()
    except:
        t.delete(1.0, END)
        t.insert(1.0, 'You have not provided any image to convert')
        tmsg.showwarning(
            title='Alert!', message='Please provide proper formatted image')
        return
    f_name = filename[start+1:last]+'.txt'
    f_name = os.path.join(r'Database', f_name)
    f = open(f_name, 'w')
    f.write(text)
    f.close()
  
# Menu bar and navigation tab creation
mainmenu = Menu(root)
mainmenu.config(font = ('Times', 29))
  
m1 = Menu(mainmenu, tearoff = 0)
m1.add_command(label = 'Scan/Upload Visiting or Bussiness cards and get all the text of cards',
               font = ('Times', 13))
root.config(menu = mainmenu)
mainmenu.add_cascade(label = 'Aim', menu = m1)
  
m2 = Menu(mainmenu, tearoff = 0)
m2.add_command(label = '|| Electronics and Communication engineering student ||', 
               font = ('Times', 13))
m2.add_command(label = '|| Coding Enthusiast ||', font = ('Times', 13))
root.config(menu = mainmenu)
mainmenu.add_cascade(label = 'About us', menu = m2)
  
m3 = Menu(mainmenu, tearoff=0)
m3.add_command(label = 'E-mail: mathurkartik1234@gmail.com', 
               font = ('Times', 13))
m3.add_separator()
m3.add_command(label = 'Mobile: +91-9587823004', font=('Times', 13))
m3.add_separator()
m3.add_command(label = 'LinkedIn: https://www.linkedin.com/in/kartik-mathur-97a825160',
               font = ('Times', 13))
root.config(menu = mainmenu)
mainmenu.add_cascade(label = 'Contact us', menu = m3)
  
Label(text = 'Visiting card scanner', bg = '#FAD2B8',
      fg = '#39322D', font = ('Times', 18)).pack(fill = 'x')
Label(text = 'Python GUI', bg = '#FAD2B8', fg ='#39322D', font=(
    'Times New Roman', 12, 'italic')).pack(fill='x')
  
f1 = Frame()
f1.config(bg='white')
Label(f1, text='Browse photo to upload', width=20,
      font=('Times', 15), bg='white').pack(side='left')
Label(f1, text='format: png/jpeg', bg='white',
      width=30).pack(side='right', padx=5)
Button(f1, text='Upload card', bg='#F58D4B', font=('Times', 15),
       width=70, command=upload_file).pack(side='right')
f1.pack(pady=10, fill='x')
p_label_var = StringVar()
p_label_var.set('Please upload an image to scan')
l = Label(textvariable=p_label_var, fg='red', bg='white')
l.pack()
  
Label(text='©copyright 2020', bg='#433E3B', fg='white',
      font=('Times', 10)).pack(side='bottom', fill='x')
Label(text='Developer: Kartik Mathur', bg='#433E3B', fg='white',
      font=('Times', 10, ' italic')).pack(side='bottom', fill='x')
t = Text(root, height='9', font=('Times', 13))
t.pack(side='bottom', fill='x')
t.insert(1.0, 'Text of converted card will be shown here...', END)
c_label_var = StringVar()
c_label_var.set('Ready for conversion')
c_label = Label(textvariable=c_label_var)
c_label.pack(side='bottom', anchor='w')
Button(root, text='Scan and Convert', bg='#F58D4B', font=('Times', 15),
       width=70, command=convert).pack(pady='10', side='bottom')
root.mainloop()


输出:

名片扫描仪 GUI

上图描绘了应用程序界面。

如何使用和如何工作?

  • 用户可以扫描和上传两种格式的图像(即 jpeg、png)
  • 单击“上传卡片”后,用户将进入文件对话框,可以选择要转换的所需图像。
  • 上传成功后会提示图片上传成功。
  • 现在用户可以通过单击“扫描和转换”按钮来转换它。
  • 文本信息将显示在文本区域中,转换后的文件将存储在内部数据库中。

结果与分析:

转换的准确率和效率都非常高,所以推荐使用这个pytesseract库是一种非常高效的转换方式。

Uploaded image

Image embedded text-to-plain text output