Use OCR para extraer texto de una imagen en OpenCV

Salman Mehmood 10 octubre 2023
Use OCR para extraer texto de una imagen en OpenCV

Este artículo cubrirá todo lo que necesita para comenzar con el reconocimiento óptico de caracteres, también conocido como OCR. Aprenderá cómo extraer texto de imágenes y visualizar el texto extraído en una imagen en OpenCV.

Use OCR con la biblioteca EasyOCR para extraer texto de una imagen en OpenCV

En este artículo, hay cuatro cosas clave que debemos hacer:

  • Necesitamos instalar e importar nuestras dependencias.
  • Luego, necesitamos leer nuestras imágenes o video.
  • A continuación, dibujaremos nuestros resultados.
  • Por último, usaremos OpenCV para ver cómo podemos manejar imágenes con varias líneas de texto y visualizarlas.

El reconocimiento óptico de caracteres, también conocido como OCR, reconoce texto en imágenes. Convierte texto apretado escrito a mano o impreso en un formato legible por máquina.

Muchas industrias utilizan la tecnología OCR para la banca automatizada; uno puede usar OCR para procesar cheques escritos a mano. Otra aplicación importante de OCR es extraer información de documentos escritos a mano.

Usaremos la biblioteca EasyOCR para usar OCR, que funciona con la biblioteca PyTorch. Esta biblioteca facilita la búsqueda y el reconocimiento óptico de caracteres en una imagen o documento.

Comencemos con la instalación e importemos nuestras dependencias. La primera dependencia que necesitamos instalar es PyTorch porque EasyOCR se ejecuta en PyTorch.

Depende del tipo de sistema operativo que esté ejecutando el usuario y del uso o no de una GPU. La instalación puede ser ligeramente diferente, pero lo bueno es que si el usuario va a python.org, automáticamente seleccionará el mejor tipo de método de instalación para el usuario.

Ejecute este comando para instalar el paquete EasyOCR:

pip install easyocr

Ahora estamos listos para usar las dependencias.

import easyocr
import cv2
import matplotlib.pyplot as plot
import numpy as np

Ahora necesitamos leer nuestras imágenes. Incluiremos una variable para mantener esa ruta de imagen, y lo siguiente es usar EasyOCR para realizar ese reconocimiento óptico de caracteres.

Definimos la clase easyocr.Reader(), y le pasamos el lenguaje que queríamos usar. Si no estamos usando GPU, pondremos el parámetro gpu igual a False.

En la siguiente línea, definimos el método reader.readtext() y pasamos nuestra ruta de imagen.

IMG_P = "sign.png"
reader = easyocr.Reader(["en"])
RST = reader.readtext(IMG_P)
RST

Su resultado regresa con algunas cosas diferentes cuando ejecutamos este código.

OpenCV OCR salida 1

Obtuvimos una matriz donde el texto está en nuestra imagen, y podremos verlo mejor cuando lo visualicemos. La segunda parte es el texto identificado, y la última es la confianza.

Visualicemos el resultado, y para hacer esto, necesitamos definir un par de variables clave para identificar dónde están nuestras diferentes coordenadas. Obtendremos los valores de la esquina superior izquierda y la esquina inferior derecha para obtener y definir las coordenadas.

Definiremos índices de la matriz para tomar los valores de los componentes y convertirlos en una tupla porque cuando se pasa a OpenCV, espera una tupla como argumento.

Haremos algo similar para tomar la parte inferior derecha y el texto, pero no necesitamos convertir el texto en una tupla.

T_LEFT = tuple(RST[0][0][0])
B_RIGHT = tuple(RST[0][0][2])
text = RST[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX

Ahora usamos el método imread() para leer nuestra imagen, y en la siguiente línea, superponemos el rectángulo, que es el componente, y luego superponemos nuestro texto para dibujar nuestro rectángulo.

El método rectangle() toma el primer parámetro como una imagen. El siguiente parámetro que pasamos es la coordenada T_LEFT, y el siguiente es la coordenada B_RIGHT.

El siguiente parámetro que se pasa es una tupla, y sigue a un color verde brillante. También pasamos el grosor del rectángulo.

Visualizamos el texto usando el método putText() que toma varios parámetros. La primera es una coordenada de la imagen donde queremos establecer la posición del texto extraído, el estilo de fuente y el tamaño de fuente, y la siguiente consiste en el color, el grosor y el estilo de línea.

import easyocr
import cv2
import matplotlib.pyplot as plot
import numpy as np

IMG_P = "surf.jpeg"
reader = easyocr.Reader(["en"])
RST = reader.readtext(IMG_P)
RST

T_LEFT = tuple(RST[0][0][0])
B_RIGHT = tuple(RST[0][0][2])
text = RST[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX

IMG = cv2.imread("surf.jpeg")
IMG = cv2.rectangle(IMG, T_LEFT, B_RIGHT, (0, 255, 0), 3)
IMG = cv2.putText(IMG, text, T_LEFT, font, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
plot.imshow(IMG)
plot.show()

Podemos ver un cuadro dibujado alrededor del texto, y el surf aparece dentro del rectángulo.

OpenCV OCR salida 2

Veamos cómo manejar si tenemos una imagen que tiene varias líneas de texto. Es más o menos lo mismo; lo único que cambia es cuando imprimimos los resultados, vemos varias líneas diferentes.

Por lo tanto, necesitamos recorrer para visualizar y trazar cada detección individualmente.

import easyocr
import cv2
import matplotlib.pyplot as plot
import numpy as np

IMG_P = "sign.png"

reader = easyocr.Reader(["en"])
RST = reader.readtext(IMG_P)
RST

font = cv2.FONT_HERSHEY_SIMPLEX

IMG = cv2.imread(IMG_P)
spacer = 100
for detection in RST:
    T_LEFT = tuple(detection[0][0])
    B_RIGHT = tuple(detection[0][2])
    TEXT = detection[1]
    IMG = cv2.rectangle(IMG, T_LEFT, B_RIGHT, (0, 255, 0), 3)
    IMG = cv2.putText(IMG, TEXT, (20, spacer), font, 0.5, (0, 255, 0), 2, cv2.LINE_AA)
    spacer += 15

plot.imshow(IMG)
plot.show()

Producción:

OpenCV OCR salida 3

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Python OpenCV