2011-01-16 50 views
16

Estoy desarrollando una aplicación para leer las letras y números de una imagen usando opencv en C++. Primero cambié la imagen de color y la plantilla de color a una imagen binaria, luego llamé al método cvMatchTemplate(). Este método acaba de resaltar las áreas donde coincide la plantilla. Pero no está claro. Simplemente no quiero ver el área. Necesito analizar los caracteres (letras &) de la imagen. Soy nuevo en openCV. ¿Alguien sabe algún otro método para obtener el resultado?leer números y letras de una imagen usando openCV

alt text

La imagen se toma desde la cámara. la imagen de muestra se muestra arriba. Necesito obtener todos los textos de la pantalla LED (130 y Delft Tanthaf).

Amigos Probé con la aplicación de muestra de detección de rostros, detecta las caras. el archivo HaarCascade se proporciona con openCV. Acabo de cargar ese archivo y llamé al método cvHaarDetectObjects(); Para detectar las letras creé el archivo xml utilizando la aplicación letter_recog.cpp proporcionada por openCV. Pero cuando cargo este archivo, muestra algún error (error de OpenCV: error no especificado> en una función desconocida, archivo ........ \ ocv \ opencv \ src \ cxcore \ cxpersistence.cpp, línea 4720). Busqué en la web este error y obtuve la información sobre los archivos lib utilizados. Lo hice, pero el error aún permanece. ¿Es el error con mi archivo xml o llamando al método para cargar este archivo xml ((CvHaarClassifierCascade *) cvLoad ("nombre de archivo xml incorporado", 0,0,0);) ?? Por favor, ayuda ...

Gracias de antemano

Respuesta

4

Véase mi respuesta a How to read time from recorded surveillance camera video? Puede/debe usar cvMatchTemplate() de hacer eso.

+0

pero la posición de dígitos en la imagen pueden variar, así que no se puede comparar a determinada posición de la imagen. La imagen comparada no está clara, entonces ¿cómo obtendré el dígito particular de la imagen? – asifkt

+0

@asifkt, luego edite su pregunta para dar más detalles sobre su aplicación. ¿Qué sabes sobre las letras (fuentes, tamaños, perspectiva) de la fuente de la imagen (video, escáner, etc.) y más? Esto ayudará a enfocarse en posibles soluciones. –

+0

Desarrollé la aplicación de detección de rostros. En realidad, el archivo en cascada haarcascade_frontalface_alt.xml se proporciona con opencv. Para el reconocimiento de letras, necesito crear un archivo xml.Así que usé opencv_createsamples.exe, archivos opencv_haartraining.exe para crear este archivo. Di un logotipo como imagen positiva y otras 5 imágenes que no contienen el logotipo como imágenes negativas. No recibí ningún archivo xml entrenando. Oí que tomará al menos 3 días para el entrenamiento del haar. ¿¿Es verdad?? Para obtener un xml intermedio, necesito usar el archivo convert_cascade.exe. Si lo uso, ¿obtendré el mejor resultado? – asifkt

0

Si está trabajando con un conjunto fijo de destinos de bus, la coincidencia de plantilla funcionará.

Sin embargo, si desea que el sistema sea más flexible, me imagino que necesitaría algún tipo de análisis de contorno/forma para cada letra individual.

8

La coincidencia de plantillas no suele ser robusta para este tipo de aplicaciones debido a inconsistencias en la iluminación, cambios de orientación, cambios de escala, etc. La forma típica de resolver este problema es incorporar el aprendizaje automático. Lo que intenta hacer formando a su propio clasificador de potencia es un posible enfoque. Sin embargo, no creo que estés entrenando correctamente. ¿Mencionó que le dio 1 logo como una imagen de entrenamiento positiva y 5 otras imágenes que no contienen el logotipo como ejemplos negativos? En general, necesita muestras de capacitación en el orden de cientos o miles o más. No se puede entrenar con 6 muestras de entrenamiento y esperar que funcione.

Si no está familiarizado con el aprendizaje de máquina, aquí es más o menos lo que debe hacer:

1) Usted necesita recoger muchos muestras positivas de formación (de cien en adelante, pero en general, cuantos más mejor) de el objeto que intentas detectar Si está intentando detectar caracteres individuales en la imagen, obtenga imágenes recortadas de caracteres individuales. Puede comenzar con la base de datos MNIST para esto. Mejor aún, para entrenar al clasificador para su problema particular, obtenga muchas imágenes recortadas de los personajes en el bus de las fotos. Si está intentando detectar todo el panel rectangular de la placa LED, entonces use imágenes de ellos como muestras de entrenamiento positivas.

2) Necesitará recolectar muchas muestras de entrenamiento negativo. Su número debe estar en el mismo orden que la cantidad de muestras de entrenamiento positivas que tenga.Estas podrían ser imágenes de otros objetos que aparecen en las imágenes en las que ejecutará su detector. Por ejemplo, puede recortar imágenes de la parte delantera del autobús, superficies de carreteras, árboles a lo largo de la carretera, etc. y utilizarlas como ejemplos negativos. Esto es para ayudar al clasificador a descartar estos objetos en la imagen en la que ejecuta su detector. Por lo tanto, los ejemplos negativos son y no cualquier imagen que contenga objetos que no desee detectar. Deben ser objetos que puedan confundirse con el objeto que intenta detectar en las imágenes en las que ejecuta el detector (al menos en su caso).

Véase el siguiente enlace sobre cómo entrenar a la cascada de clasificador y producir el archivo de modelo XML: http://note.sonots.com/SciSoftware/haartraining.html

A pesar de que usted ha mencionado solo deseas para detectar los caracteres individuales en lugar de todo el panel de LED en el autobús, Recomiendo primero detectar el panel LED para localizar la región que contiene los caracteres de interés. Después de eso, realice la coincidencia de plantillas dentro de esta región más pequeña o ejecute un clasificador capacitado para reconocer caracteres individuales en parches de píxeles en esta región obtenidos utilizando el enfoque de ventana deslizante, y posiblemente a escala múltiple. (Nota: el clasificador de aumento de haarcascade que mencionó anteriormente detectará caracteres pero no le dirá qué carácter detectó a menos que solo lo entrene para detectar ese personaje en particular ...) Detectar caracteres en esta región de una manera deslizante dará usted el orden en que aparecen los caracteres para que pueda encadenarlos en palabras, etc.

Espero que esto ayude.

EDIT:

que sucedió al azar en este antiguo puesto de la mina después de descubrir separado del módulo de texto escena en OpenCV 3 mencionado por @KaolinFire.

Para aquellos que tienen curiosidad, este es el resultado de ejecutar ese detector en la imagen de muestra dada por el OP. Tenga en cuenta que el detector puede localizar la región de texto, aunque devuelva más de un cuadro delimitador.

Result of OpenCV 3 text detector.

Tenga en cuenta que este método no es infalible (al menos esta implementación en OpenCV con los parámetros por defecto). Tiende a generar falsos positivos, especialmente cuando la imagen de entrada contiene muchos "distractores". Aquí están más ejemplos obtenidos utilizando este detector de texto OpenCV 3 en el Google Street View conjunto de datos:

Negative result 1 Negative result 2 Negative result 3 Negative result 4

cuenta de que tiene una tendencia a encontrar "texto" entre las líneas paralelas (por ejemplo, , ventanas, paredes, etc.). Como es probable que la imagen de entrada del OP contenga escenas exteriores, esto será un problema, especialmente si no restringe la región de interés a una región más pequeña alrededor de los letreros LED.

Parece que si puede localizar una región "rugosa" que contenga solo el texto (por ejemplo, solo el letrero LED en la imagen de muestra del OP), ejecutar este algoritmo puede ayudarle a obtener un cuadro delimitador más ajustado. Sin embargo, tendrá que lidiar con los falsos positivos (tal vez descartando regiones pequeñas o eligiendo entre los cuadros delimitadores superpuestos usando una heurística basada en el conocimiento sobre la forma en que las letras aparecen en los letreros LED).

Aquí hay más recursos (discusión + código + conjuntos de datos) sobre detección de texto.

Código

Conjuntos de datos

Encontrará los Google vista calle y MSRA conjuntos de datos aquí. Aunque las imágenes en estos conjuntos de datos no son exactamente las mismas que las de los letreros LED en los autobuses, pueden ser útiles para escoger el "mejor" algoritmo de entre varios algoritmos competidores, o para entrenar un algoritmo de aprendizaje automático desde cero.

http://www.iapr-tc11.org/mediawiki/index.php/Datasets_List

12

A partir de OpenCV 3.0 (en dev activo), puede utilizar la "escena del texto" módulo de detección de objetos incorporada ~

La detección de texto se basa en estos dos documentos:

Una vez que haya encontrado dónde está el texto en la escena, puede ejecutar cualquier tipo de OCR estándar contra esas rebanadas (Tesseract OCR es común). Y ahora hay una muestra de extremo a extremo en OpenCV usando la nueva interfaz de OpenCV a Tesseract:

+0

Ni la referencia ni el ejemplo están disponibles –

+2

Hmm. Es extraño que lo movieran todo. :/Actualizando lo que puedo. –

Cuestiones relacionadas