c# - vehiculares - ¿Cuáles son los buenos algoritmos para la detección de matrículas de vehículos?
software para reconocimiento de placas vehiculares (11)
Fondo
Para mi proyecto final en la universidad, estoy desarrollando una aplicación de detección de matrícula de vehículos. Me considero un programador intermedio, sin embargo, mi conocimiento de las matemáticas carece de algo más que la escuela secundaria, lo que hace que producir las fórmulas correctas sea más difícil de lo que debería ser.
Me he pasado una buena cantidad de tiempo buscando documentos académicos como:
- Detección de matrículas de vehículos en imágenes
- Robusta detección de placa de matrícula utilizando Image Saliency
- Mejora local de la imagen del automóvil para la detección de matrículas
Cuando se trata de las matemáticas, estoy perdido. Debido a esta prueba, varias imágenes gráficas resultaron productivas, por ejemplo:
a
Sin embargo, este enfoque solo funcionó para esa imagen en particular, y si las técnicas se aplicaron a diferentes imágenes, estoy seguro de que se produciría una conversión más pobre. He leído sobre una fórmula llamada "transformación de la morfología del sombrero del fondo", que hace lo siguiente:
Básicamente, la transformación mantiene todos los detalles oscuros de la imagen y elimina todo lo demás (incluidas las regiones oscuras más grandes y las regiones claras).
No puedo encontrar mucha información sobre esto, sin embargo, la imagen dentro de la documentación cerca del final del informe muestra su efectividad.
Otras restricciones
- Desarrollando en C #
- Limitar el proyecto solo a las placas de registro del Reino Unido
- Puedo elegir las imágenes para convertirlas en una demostración
Pregunta
Necesito asesoramiento sobre las técnicas de transformación en las que debería centrarme y sobre qué algoritmos pueden ayudarme.
EDITAR: Nueva información presente en Continuación - Detección de placa de matrícula de vehículo
Aquí es cómo sugiero que debe hacer esta tarea. Lea mi respuesta detallada here .
- Convierte a escala de grises
- Desenfoque gaussiano con filtro 3x3 o 5x5.
Aplicar el filtro Sobel para encontrar los bordes verticales.
Sobel(gray, dst, -1, 1, 0)
- Umbral de la imagen resultante para obtener una imagen binaria.
- Aplicar una operación de cierre morfológico usando un elemento estructurador adecuado.
- Encuentra los contornos de la imagen resultante.
- Encuentra
minAreaRect
de cada contorno. Seleccione rectángulos según la relación de aspecto y el área mínima y máxima. - Para cada contorno seleccionado, encuentre la densidad del borde. Establezca un umbral para la densidad del borde y elija los rectángulos que rompan ese umbral como posibles regiones de placa.
- Pocos rectángulos permanecerán después de esto. Puede filtrarlos en función de la orientación o de cualquier criterio que considere adecuado.
- Recorte estas partes rectangulares detectadas de una imagen después del
adaptiveThreshold
de la imagen original (escala de grises) y aplique OCR.
El Reino Unido ya tiene un sistema que hace eso. Recuerdo haber visto un programa de televisión en el que demostraron que podían encontrar un automóvil dentro de Londres en 10 minutos (suponiendo que supieran el número y el automóvil circula). La simple lectura de Wikipedia te da los indicadores que necesitas para empezar a pensar sobre el tema: http://en.wikipedia.org/wiki/Automatic_number_plate_recognition
Es posible que desee consultar www.openalpr.com como punto de partida. Utiliza una serie de técnicas para encontrar y analizar la matrícula.
Este es claramente un problema de visión por computadora. Eche un vistazo a OpenCV . Está en C ++, pero probablemente podrá interactuar con él de alguna manera .
Hay una serie de enfoques que puede tomar, pero la primera estrategia que se le ocurre es:
- Descubrimiento / investigación: identifique el conjunto de colores y fuentes que puede necesitar identificar. Si su imagen de muestra es representativa de la mayoría de las planchas británicas, entonces su trabajo es más fácil. Por ejemplo, fuente simple, singular y letras negras sobre fondo blanco
- Código: intento de identificar una región rectangular de una imagen donde los colores son predominantemente blancos y negros. Este no es un problema terriblemente matemático y debería darte la región de placa para concentrarte.
- Código: haga algo de limpieza en su subregión, tal conversión a blanco y negro puro (monocromo) y tal vez escalar / cambiar a un rectángulo agradable y ajustado.
- Usar API: a continuación, utilice un algoritmo de reconocimiento óptico de caracteres (OCR) existente en su región de imagen sub-seleccionada para ver si puede leer el texto.
Como dije, esta es una estrategia de muchas, pero me viene a la mente que requiere la menor cantidad de cálculos pesados ... es decir, si puede encontrar una implementación de OCR que funcione para usted.
Hice un proyecto similar hace unos años en Java, primero apliqué el operador Sobel y luego enmascaré toda la imagen con una imagen de una placa (con el operador Sobel aplicado también). La región de máxima coincidencia es donde está la placa. Luego, aplique un OCR a la región seleccionada para obtener el número.
Le dice exactamente cómo calcular la transformación de sombrero inferior (algo así como una transformación de umbral graduado invertido para mí).
Lo primero que hay que hacer es implementar las dos funciones de morfología dilatación y erosión.
Para hacer esto necesitas tus f y b luego calculas la función sobre una pequeña región de la imagen en un punto manteniendo el mayor valor encontrado.
(f ⊕ b)(s, t) = max{f (s − x, t − y) + b(x, y)
|(s − x), (t − y) ∈ Df ; (x, y)∈Db}
Lo que esto dice es que tome el máximo de la expresión sobre todos los puntos en la región del dominio (como un pequeño rectángulo centrado en su punto (s, t).
pseudo código simple sería
max = -infinity // for the point (s,t) on the image, must compute this for all points
for(x = -5 to 5)
for(y = -5 to 5)
max = Max(max, f(s - x, t - y) + b(x,y))
efectivamente, ahora tenemos una nueva imagen de los valores máximos.
En realidad es bastante simple, así que no lo haga más difícil de lo que es (simplemente estamos agregando b (x, y) a cada punto en la región y descubriendo cuál da el valor máximo).
haces lo mismo por la erosión (muy similar a la anterior)
Ahora la apertura y el cierre es la composición de los dos
Primero puedes pensar en realizar una dilatación y luego una erosión en una apertura.
Dice finalmente restar el cierre de la imagen original y deberías tener tu transformación.
Puedes echar un vistazo a uno de los ejemplos de emgucv que te muestran un mundo real que funciona ejemplos de detección de placas de vehículos usando OCR
Si le interesa el problema de detectar la presencia de una matrícula (en lugar de reconocerla), probablemente debería considerar la detección de texto en las imágenes, ya que está relacionado con lo que está haciendo.
Esta pregunta está relacionada con la suya: Algoritmo para detectar la presencia de texto en la imagen
También puede consultar la biblioteca de Reconocimiento automático de matrículas y esta consulta . Esto también le dará una idea acerca de cómo abordar las cosas y cómo son las soluciones existentes.
Pero como Paul lo contestó, primero debes tratar de encontrar la matrícula rectangular de la imagen completa y luego binarizarla y luego usar las bibliotecas de OCR disponibles (se recomienda Tesseract)
Puede consultar este link que lo ayudará a encontrar la placa rectangular. Necesita usar librerías openCV, por lo que no necesitará mucha matemática, pero sí, una comprensión básica de lo que sucede detrás de las escenas puede ayudarlo a resolver el problema de una mejor manera.
puede usar la detección de rectángulo en OpenCV o entrenar características similares a las de Haar para detectar placas que también se presentan en opencv