Aplicación de GUI de escáner de tarjetas de visita usando Python

Python es un lenguaje de programación emergente que consta de muchos módulos y bibliotecas integrados. Que brinda soporte a muchas aplicaciones web y ágiles. Debido a su comportamiento de sintaxis limpio y conciso, muchas organizaciones gigantes y renombradas como Instagram, Netflix, etc., están trabajando en el marco de trabajo de Python y se dirigen hacia un crecimiento magnífico. En este artículo, vamos a crear una aplicación GUI para escanear la tarjeta de visita usando Tkinter .

Tkinter es un conjunto de herramientas muy sólido y fácil de usar, ya que brinda a los usuarios un control total para modificar su comportamiento y los atributos de los widgets disponibles en la biblioteca de Tkinter. Dado que Tkinter proporciona un marco de trabajo orientado a objetos, es una forma mucho mejor de programar para una aplicación. La interfaz orientada a objetos en Tkinter cumple con el principio DRY (No te repitas) y ayuda a reducir la redundancia del código. 

Bibliotecas Py requeridas:

Introducción de las bibliotecas mencionadas anteriormente:

  • Biblioteca Pytesseract: Pytesseract es un kit de herramientas basado en ICR (reconocimiento inteligente de caracteres) y OCR (reconocimiento óptico de caracteres) disponible en python. Es una herramienta de envoltorio de Google y puede «Extraer» y «Leer» el texto incrustado en cualquier imagen. Para comenzar, en primer lugar, instale y ejecute Pytesseract en su sistema utilizando la configuración de tesseract disponible aquí . Para instalar pytesseract en el shell después de instalar la aplicación desde el enlace Github anterior
pip install pytesseract
  • Biblioteca de Pillows: es una biblioteca gratuita de código abierto disponible en Python para el procesamiento de imágenes (manipulación, apertura y cierre de varios formatos de archivo, es decir, jpeg/png).
pip install Pillow
  • Módulo Os: Es un módulo interactivo que se ocupa de la transacción de archivos entre el programa y el sistema operativo. El módulo de utilidad os.path proporciona la funcionalidad de compartir archivos.

Enfoque del programa:

  • En primer lugar, crearemos una interfaz, es decir, una GUI utilizando varios widgets y atributos disponibles en Tkinter como Etiqueta, Botón, Marco, etc.
  • Después de crear un diseño básico, ahora estamos listos para hacerlo receptivo implementando su funcionalidad principal, es decir, cargando un archivo y luego convirtiéndolo.
  • La lógica del cuadro de diálogo Archivo funcionará aquí para que las imágenes formateadas correctamente se puedan cargar en el software.
  • En una carga exitosa, el sistema ahora está listo para la conversión y ahora entra en juego el rol del módulo Pytesseract . El módulo Pytesseract leerá y extraerá el texto incrustado de la imagen y actualizará el área de texto con ese texto convertido.
  • Además, el enfoque de manejo de archivos en python creará y agregará un archivo de texto con ese texto convertido y lo almacenará en la base de datos local de nuestro sistema.
  • Se puede acceder al archivo almacenado en el futuro con fines de información y verificación.

A continuación se muestra la implementación completa:

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 Business 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()

Producción:

Interfaz gráfica de usuario del escáner de tarjetas de visita

La imagen de arriba muestra la interfaz de la aplicación.

¿Cómo usar y cómo funciona?

  • El usuario puede escanear y cargar una imagen en dos formatos (es decir, jpeg, png)
  • Al hacer clic en «Cargar tarjeta», el usuario aterrizará en el cuadro de diálogo del archivo y podrá seleccionar una imagen requerida para convertir.
  • Después de una carga exitosa, se le indicará que la imagen se cargó correctamente.
  • Ahora el usuario puede convertirlo haciendo clic en el botón «Escanear y convertir».
  • La información de texto se mostrará en el área de texto y el archivo convertido se almacenará en la base de datos interna.

Resultado y Análisis:

La precisión y la eficiencia de la conversión son muy altas, por lo que se recomienda el uso de esta biblioteca pytesseract como una forma muy eficiente de conversión.

Imagen cargada

Imagen incrustada de texto a texto sin formato

Publicación traducida automáticamente

Artículo escrito por mathurkartik1234 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *