Este repositorio contiene el proyecto final desarrollado para la asignatura de (TIM) en la Universidad Rey Juan Carlos. El objetivo principal del proyecto es la segmentación y reconocimiento de matrículas, es decir:
- Obtener una imagen independiente solamente con la matricula.
- Generar un texto equivalente a los carácteres de la matricula.
Para la resolución del problema se han puesto en práctica los conceptos vistos en el tema 2 (tratamiento de imágenes), y la implementación de un modelo entrenado (esencialmente un decisor) que nos ayuda a identificar los carácteres en la matricula.
-
Paso 1: Clona el repositorio en tu máquina local.
git clone https://github.com/aMonteSl/Autodetector_Matriculas.git
-
Paso 2: Navega al directorio del proyecto.
cd Autodetector_Matriculas
-
Paso 3: Instala las dependencias1.
pip install -r requirements.txt
-
Paso 4: Instalamos el modelo entrenado y más dependencias.
sudo apt install tesseract-ocr sudo apt install libtesseract-dev
-
Paso 5: Copiamos la salida de este comando.
which tesseract
-
Paso 6: Configuramos el programa.
- Abrimos en nuestro editor favorito el programa
character_decider.py
. Pegamos en la línea 17 la salida del comando anterior. Quedaría algo así:
- Paso 7: Ejecución del programa.
-
Probado en Ubuntu usando python3.10 como interprete
python3 .\main.py
-
Paso 1: Clona el repositorio en tu máquina local.
git clone https://github.com/aMonteSl/Autodetector_Matriculas.git
-
Paso 2: Navega al directorio del proyecto.
cd Autodetector_Matriculas
-
Paso 3: Instala las dependencias1.
pip install -r requirements.txt
-
Paso 4: Instalamos el modelo entrenado y mas dependencias.
-
El video explica cómo crear un entorno virtual. No hacer el entorno virtual, genera conflicto entre librerias internas del sistema que son necesarias.
-
En el requitements.txt ya esta introducido el comando: pip install pytesseract
- Paso 5: Copiamos la ruta de instalacion de pytesseract.
- Paso 6: Configuramos el programa.
- Abrimos en nuestro editor favorito el programa
character_decider.py
. Pegamos en la línea 17 la ruta que hemos copiado en el anterior paso. Quedaría algo así:
- Paso 7: Ejecución del programa.
-
Probado en Windows usando python3.12 como interprete
python3 .\main.py
- Para la instalación en Mac, simplemente sigue los pasos similares a los de Windows. En cuanto a la instalación del modelo entrenado, consulta el video de Windows hasta la sección donde distingue la instalación entre sistemas operativos. Posteriormente, sigue las instrucciones proporcionadas en el manual de usuario de Pytesseract. En el caso de Mac, no hemos encontrado vídeos ni explicaciones sencillas específicas para esta etapa, y no hemos podido realizar pruebas en este sistema operativo.
Warning
Esta instalación no es trivial y pueden surgir problemas en el camino. Si tienes alguno, por favor, contacta con nosotros por correo o teléfono indicando el sistema operativo que estas usando: Preferentemente contactar a Carlos Nebril para problemas con la instalacion en Ubuntu y para Windows recomendamos contactar con Adrián Montes.
- [email protected] / [email protected]
- 654 63 12 07 / 637 68 23 61
Para tener una idea general, el proyecto sigue esta estructura de directorios:
Autodetector_Matriculas/
├── CarGithub_Images/
│ ├── 1_Coche.jpg
│ ├── 2_Coche.jpg
│ ├── ...
│ └── 14_Coche.jpg
├── DetectedPlates
│ └── user_inputs.txt
├── Github_Images
│ └── ...
├── character_decider.py
├── license_plate_detector.py
├── license_plate_reader.log
├── license_plate_segmenter.py
├── main.py
├── README.md
├── requirements.txt
└── license_plates_text.txt
Este programa emplea avanzadas técnicas de procesamiento de imágenes para la detección de matrículas en una imagen. El proceso se divide en dos fases fundamentales:
Mediante el empleo de técnicas de procesamiento de imágenes, podremos reconocer la matrícula de un vehículo en una imagen. Posteriormente, almacenaremos dicha matrícula como otra imagen independiente, la cual será utilizada en la siguiente fase.
Los archivos usados para esta tarea son: license_plate_detector.py
y license_plate_segmenter.py
. Los códigos estan bien documentados para su correcta compresión, aun así, vamos a hacer un pequeño resumen de su funcionalidad básica.
Este script implementa un lector de placas de matrícula que utiliza operaciones de procesamiento de imágenes para detectar y extraer la región de la placa de matrícula de una imagen dada. Aquí está un resumen de las principales funciones y su funcionalidad:
Función | Descripción |
---|---|
grayscale | Convierte la imagen a escala de grises y aplica desenfoque. |
apply_threshold | Aplica umbral binario inverso a la imagen. |
apply_adaptive_threshold | Aplica umbral adaptativo a la imagen. |
find_contours | Encuentra contornos en la imagen. |
filter_candidates | Filtra los contornos candidatos basados en área y relación de aspecto. |
get_lowest_candidate | Obtiene el contorno candidato con la coordenada Y más baja (las matrículas del coche suelen estar en la parte baja de las imágenes). |
crop_license_plate | Recorta la región de la placa de matrícula de la imagen original con un margen expandido. |
close_and_open | Aplica operaciones morfológicas de cierre y apertura a la imagen (daba mejores resultados que hacerlo como lo vimos en clase, es decir, al revés). |
clear_border | Limpia el borde de la imagen utilizando skimage.segmentation.clear_border. |
invert_image | Invierte los colores de la imagen. |
draw_contours | Dibuja contornos en la imagen original. |
read_license | Método principal para leer la placa de matrícula: procesa la imagen, detecta contornos, filtra candidatos y devuelve la imagen procesada final o un mensaje de error si no se encuentra la placa de matrícula. |
El script se puede utilizar proporcionando una imagen como entrada y llamar a la función read_license
del objeto LicensePlateReader
para procesar la imagen y mostrar la región de la placa de matrícula detectada o un mensaje de error si no se encuentra ninguna placa.
El script PlateSegmentation realiza la segmentación de placas de matrícula en imágenes de vehículos. Aquí está un resumen de sus principales funciones y su funcionalidad:
Función | Descripción |
---|---|
init | Inicializa el objeto PlateSegmentation con constantes y una instancia de LicensePlateReader. Borra y crea un directorio para almacenar las placas detectadas. |
clear_terminal | Limpia la pantalla del terminal. |
load_Github_Images | Carga y muestra imágenes disponibles para procesamiento, solicitando al usuario que haga una selección. Retorna el número de la selección y el nombre del archivo de imagen seleccionado. |
process_image | Procesa la imagen seleccionada, muestra el resultado y guarda la imagen procesada. |
display_and_save_result | Muestra la imagen procesada, la guarda y registra las entradas del usuario. |
segmentation_of_the_plate | Método principal para la segmentación de placas. Carga imágenes, procesa cada imagen y permite al usuario continuar o salir. |
crop_license_plate | Recorta la región de la placa de matrícula de la imagen original con un margen expandido. |
close_and_open | Aplica operaciones morfológicas de cierre y apertura a la imagen (daba mejores resultados que hacerlo como lo vimos en clase, es decir, al revés). |
clear_border | Limpia el borde de la imagen utilizando skimage.segmentation.clear_border. |
invert_image | Invierte los colores de la imagen. |
draw_contours | Dibuja contornos en la imagen original. |
read_license | Método principal para leer la placa de matrícula: procesa la imagen, detecta contornos, filtra candidatos y devuelve la imagen procesada final o un mensaje de error si no se encuentra la placa de matrícula. |
Este programa en Python (character_decider.py
) es un lector de placas que utiliza la biblioteca Tesseract OCR para procesar imágenes y extraer texto de placas de vehículos. Se trata de un modelo preentrenado especificamente para eso donde, internamente, esta implementado los conceptos del tema 3: decisores.
Función | Funcionalidad |
---|---|
init | Inicializa el objeto LicensePlateReader. Configura el directorio para imágenes procesadas y el archivo de salida para almacenar los resultados de texto de las placas. También configura la ruta al ejecutable de Tesseract OCR y la configuración de registro (logging). |
read_license_plates | Lee placas de vehículos a partir de imágenes procesadas y escribe los resultados en un archivo. Verifica si el directorio especificado existe, obtiene una lista de archivos ordenados numéricamente en el directorio, y procesa cada imagen para extraer el texto de la placa. Imprime los resultados en la terminal y escribe los resultados en el archivo de salida. |
read_text_from_image | Lee el texto de una imagen utilizando Tesseract OCR. Abre la imagen especificada, utiliza pytesseract para extraer el texto de la imagen y filtra los caracteres no deseados, devolviendo el texto filtrado. |
Además, en el proceso de ejecución del programa crearemos distintos .txt
donde podremos ir viendo lo que ocurre internamente en el programa, a continuación un ejemplo de cada uno:
1. user_inputs.txt
:
Este fichero contendra la información de que imagenes a seleccionado el usuario, el nombre del fichero imagen que ha seleccionado y el directorio donde se encuentra la imagen, ejemplo:
User choice: 1, Selected image: 1_Coche.jpg. Path: C:\Users\adrian\Escritorio\AutoMatriculas\DetectedPlates\plate1.jpg
User choice: 8, Selected image: 8_Coche.jpg. Path: C:\Users\adrian\Escritorio\AutoMatriculas\DetectedPlates\plate8.jpg
En este fichero guardaremos la información respecto el nombre de la imagen que contiene la matricula (es decir la imagen generada en la primera fase) y el texto que se ha detectado en dicha imagen, ejemplo:
Image Path: plate1.jpg, Plate Text: B2228HM
Image Path: plate8.jpg, Plate Text: 0007LLL
En este fichero simplemente se guardan errores que ocurran en la segunda fase, como por ejemplo que no se haya podido detectar texto en la imagen o errores similares, ejemplo:
ERROR:root:Error while processing Github_Images: 'NoneType' object has no attribute 'group'
Vamos a ir siguiendo los pasos de la metodología, mostrando los resultados generados en cada fase.
Image Path: plate1.jpg, Plate Text: B2228HM
Hemos realizado un total de dos videos explicando los resultados obtenidos en la aplicación en las dos fases comentadas previamente.
El proyecto del Autodetector de Matrículas logra una eficiente detección y reconocimiento de matrículas en imágenes de vehículos a través de técnicas avanzadas de procesamiento de imágenes y el uso de Tesseract OCR.
- Los scripts license_plate_detector.py y license_plate_segmenter.py demuestran una sólida capacidad para identificar y extraer con precisión regiones de matrículas en imágenes.
- Técnicas como la conversión a escala de grises, umbralización y detección de contornos, junto con operaciones morfológicas, contribuyen a una segmentación precisa.
- El script character_decider.py, basado en Tesseract OCR, exhibe una efectiva extracción de texto de las matrículas segmentadas.
- La adaptabilidad del sistema para manejar diferentes formatos de texto en las matrículas añade versatilidad al reconocimiento.
- Los registros, como user_inputs.txt y license_plates_text.txt, ofrecen visibilidad sobre el proceso interno del programa.
- Los registros de errores en license_plates_reader.log son cruciales para diagnosticar posibles problemas durante la ejecución.
- Aunque el proyecto cumple con los objetivos, hay oportunidades de mejora, como la optimización de algoritmos y la exploración de técnicas de aprendizaje profundo.
En resumen, el Autodetector de Matrículas proporciona una solución efectiva, sentando las bases para aplicaciones más amplias en visión por computadora y procesamiento de imágenes.
Listado de repositorios de github y videos consultados durante el desarrollo del proyecto:
-
Título: DETECCION Y RECONOCIMIENTO DE PLACAS EN TIEMPO REAL | Python OpenCV
Enlace: [https://youtu.be/0-tVTxBRgbY?si=BKN7H-yro2zl8Qvu] -
Título: 🚘 Reconocimiento de placas vehiculares | OpenCV OCR en Python
Enlace: [https://youtu.be/8rg_qi8mjjk?si=5xAsG6Wy3flwNNfD] -
Título: TUTORIAL DE PYTHON: RECONOCIMIENTO DE PATENTES
Enlace: [https://youtu.be/9dyaI3GyUtc?si=SljAZcE7u3oQ9IuO]
-
Nombre del repositorio: ConvALPR
Autor: JaviFS97
Enlace: [https://github.com/ankandrew/ConvALPR] -
Nombre del repositorio: TFG
Autor: ankandrew
Enlace: [https://github.com/JaviFS97/TFG]
- ChatGPT - [https://chat.openai.com/]
¡Gracias por visitar nuestro repositorio! Esperamos que encuentres este proyecto interesante y útil. 👩💻👨💻