reconocimiento - opencv crear imagen
leer nĂºmeros y letras de una imagen usando openCV (4)
A partir de OpenCV 3.0 (en desarrollo activo), puede utilizar el módulo de detección de objetos integrado "texto de escena" ~
Referencia: http://docs.opencv.org/3.0-beta/modules/text/doc/erfilter.html
Ejemplo: https://github.com/Itseez/opencv_contrib/blob/master/modules/text/samples/textdetection.cpp
La detección de texto se basa en estos dos documentos:
[Neumann12] Neumann L., Matas J .: Localización y reconocimiento de texto de escena en tiempo real, CVPR 2012. El documento está disponible en línea en http://cmp.felk.cvut.cz/~neumalu1/neumann-cvpr2012.pdf
[Gomez13] Gomez L. y Karatzas D .: Extracción de texto de múltiples guiones de escenas naturales, ICDAR 2013. El documento está disponible en línea en http://refbase.cvc.uab.es/files/GoK2013.pdf
Una vez que haya encontrado dónde está el texto en la escena, puede ejecutar cualquier tipo de OCR estándar contra esos cortes (el OCR de Tesseract es común). Y ahora hay una muestra de extremo a extremo en Opencv que usa la nueva interfaz de OpenCV para Tesseract:
Estoy desarrollando una aplicación para leer las letras y los números de una imagen usando opencv en c ++. Primero cambié la imagen de color dada y la plantilla de color a imagen binaria, luego llamé al método cvMatchTemplate (). Este método simplemente resaltó las áreas donde concuerda la plantilla. Pero no está claro. No quiero ver el área. Necesito analizar los caracteres (letras y números) de la imagen. Soy nuevo en openCV. ¿Alguien sabe algún otro método para obtener el resultado?
La imagen está tomada 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 que probé con la aplicación de muestra de detección de rostros, detecta los rostros. El archivo HaarCascade se proporciona con el 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 que proporciona openCV. Pero cuando cargué este archivo, muestra un error (error de OpenCV: error no especificado> en 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 creado", 0,0,0);)? por favor ayuda...
Gracias por adelantado
La coincidencia de plantillas tiende a no ser robusta para este tipo de aplicación debido a inconsistencias en la iluminación, cambios de orientación, cambios de escala, etc. La forma típica de resolver este problema es introducir el aprendizaje automático. Lo que está tratando de hacer entrenando a su propio clasificador es un posible enfoque. Sin embargo, no creo que estés haciendo el entrenamiento correctamente. ¿Mencionó que le dio 1 logotipo como imagen de entrenamiento positiva y otras 5 imágenes que no contienen el logotipo como ejemplos negativos? En general, necesita muestras de entrenamiento para que sean del orden de cientos o miles o más. No es posible entrenar con 6 muestras de entrenamiento y esperar que funcione.
Si no está familiarizado con el aprendizaje automático, esto es más o menos lo que debe hacer:
1) Es necesario que recolecte muchas muestras de entrenamiento positivas (de cien en adelante, pero generalmente cuanto más mejor) del objeto que está tratando de 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 a partir de las fotos. Si está intentando detectar todo el panel de la placa LED rectangular, entonces use imágenes de ellos como sus muestras de entrenamiento positivas.
2) Tendrá que recoger muchas muestras de entrenamiento negativas. Su número debe estar en el mismo orden que el número de muestras de entrenamiento positivas que tiene. Estas podrían ser imágenes de los otros objetos que aparecen en las imágenes en las que ejecutará su detector. Por ejemplo, podría recortar imágenes de la parte delantera del autobús, superficies de carreteras, árboles a lo largo de la carretera, etc. y usarlas 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 no son simplemente cualquier imagen que contenga objetos que no desee detectar . Deben ser objetos que podrían confundirse con el objeto que intenta detectar en las imágenes en las que ejecuta su detector (al menos para su caso).
Vea el siguiente enlace sobre cómo entrenar la cascada de clasificadores y producir el archivo de modelo XML: http://note.sonots.com/SciSoftware/haartraining.html
Aunque mencionó que solo desea detectar los caracteres individuales en lugar del panel LED completo en el bus, recomendaría primero detectar el panel LED para localizar la región que contiene los caracteres de interés. Después de eso, realice una coincidencia de plantillas dentro de esta región más pequeña o ejecute un clasificador entrenado para reconocer caracteres individuales en parches de píxeles en esta región, 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 carácter en particular ...) Detectar caracteres en esta región de una manera deslizante de ventana le dará en el orden en que aparecen los caracteres para que puedas unirlos en palabras, etc.
Espero que esto ayude.
EDITAR:
Pasé por casualidad este viejo post mío después de descubrir por separado el módulo de texto de escena en OpenCV 3 mencionado por @KaolinFire.
Para aquellos que sienten curiosidad, este es el resultado de ejecutar ese detector en la imagen de muestra proporcionada por el OP. Observe que el detector puede localizar la región de texto, aunque devuelve más de un cuadro delimitador.
Tenga en cuenta que este método no es infalible ( al menos esta implementación en OpenCV con los parámetros predeterminados ). Tiende a generar falsos positivos, especialmente cuando la imagen de entrada contiene muchos "distractores". Aquí hay más ejemplos obtenidos utilizando este detector de texto OpenCV 3 en el conjunto de datos de Google Street View:
Observe que tiene una tendencia a encontrar "texto" entre líneas paralelas (por ejemplo, ventanas, paredes, etc.). Dado que es probable que la imagen de entrada del OP contenga escenas al aire libre, esto será un problema, especialmente si no restringe la región de interés a una región más pequeña alrededor de las señales LED.
Parece que si puede localizar una región "aproximada" que contenga solo el texto (por ejemplo, solo el signo LED en la imagen de muestra del OP), ejecutar este algoritmo puede ayudarlo a obtener un cuadro de límites más estricto. Sin embargo, tendrá que lidiar con los falsos positivos (tal vez descartar pequeñas regiones o seleccionar entre los cuadros delimitadores superpuestos utilizando una heurística basada en el conocimiento de la forma en que aparecen las letras 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 conjuntos de datos de Google Streetview y MSRA 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 ya sea para seleccionar el "mejor" algoritmo de rendimiento entre varios algoritmos de la competencia, o para entrenar un algoritmo de aprendizaje automático desde cero.
Si está trabajando con un conjunto fijo de destinos de bus, la comparación de plantillas funcionará.
Sin embargo, si desea que el sistema sea más flexible, me imagino que necesitará algún tipo de análisis de contorno / forma para cada letra individual.
¿Ver mi respuesta a Cómo leer el tiempo de un video grabado de la cámara de vigilancia? Puedes / debes usar cvMatchTemplate()
para hacer eso.