rectangle recognize recognition number example python opencv edge-detection number-recognition

recognize - opencv text recognition python



Cómo clasificar los números borrosos con openCV (2)

Tienes un par de cosas que puedes usar para tu ventaja:

  • El número está dentro del bisel rectangular negro y un color
  • El número parece ser una pantalla de tipo LCD segmentada, si es así, solo hay un número finito de segmentos que están apagados o encendidos.

Entonces te sugiero que:

  • Calibre su cámara y preprocesa la imagen para eliminar la distorsión de la lente
  • Rectifique el rectángulo de visualización:
    • Detecta el rectángulo de visualización usando la intersección de las líneas de trazado, o la detección de bordes seguida de la detección del contorno y luego elige los contornos más grandes y más cuadrados
    • use GetPerspectiveTransform para obtener la transformación entre las coordenadas de la imagen y un rectángulo ideal, luego transforme la imagen de entrada usando WarpPerspective
  • Dividir imagen en canales R, G y B y calcular r - avg(g, b) , esto depende un poco de la iluminación, pero debería dar algo como esto:

  • Luego, pruebe la coincidencia de patrones en esto, o tal vez vuelva a segmentar la imagen e intente encontrar qué segmentos de visualización están iluminados, o ejecute a través de un paquete de OCR.

Me gustaría capturar el número de este tipo de imagen.

Probé la coincidencia a múltiples escalas desde el siguiente enlace.

http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/

Todo lo que quiero saber es el número rojo. Pero el problema es que el número rojo es borroso para la plantilla de reconocimiento / coincidencia de openCV. ¿Habría otra manera posible de detectar este número rojo en el fondo negro?


Clasificación de dígitos

Aclaraste en comentarios que ya has aislado la parte numérica de la pre-detección de imágenes, así que comenzaré bajo esa suposición.

Quizás pueda aproximar los efectos de perspectiva y "borrosidad" del número tratándolo como un número escrito a mano. En este caso, existe un famoso conjunto de datos de números manuscritos para el entrenamiento de clasificación llamado mnist.

Yann LeCun ha enumerado el estado del arte en este conjunto de datos aquí en un conjunto de datos escritos a mano .

En el otro extremo del espectro, las redes neuronales convolucionales producen índices de error escandalosamente bajos (fracciones de error del 1%). Para una solución más simple, los vecinos más cercanos a k que usaban desajuste, eliminación de ruido, borrosidad y cambio de 2 píxeles, producían aproximadamente el 1% de error, y es significativamente más rápido de implementar. Python opencv tiene una implementación . Las redes neuronales y las máquinas de vectores de soporte con desajuste también tienen unas tasas de rendimiento bastante impresionantes.

Tenga en cuenta que las redes convolucionales no le obligan a elegir sus propias características, por lo que la importante información de diferencia de color aquí podría utilizarse simplemente para reducir la región de interés. Otros enfoques, donde defina su espacio de características, podrían incorporar la diferencia de color conocida con mayor precisión.

Python admite muchas técnicas de aprendizaje automático en el fabuloso paquete sklearn: aquí hay ejemplos de sklearn aplicados a mnist . Si está buscando una explicación tutorial del aprendizaje automático en python, el propio tutorial de sklearn es muy detallado

Desde el enlace sklearn:

Esos son los tipos de elementos que intenta clasificar si aprende utilizando este enfoque. Para enfatizar cuán fácil es comenzar a entrenar algunos de estos clasificadores basados ​​en el aprendizaje automático, aquí hay una sección abreviada del código de ejemplo en el paquete sklearn vinculado:

digits = datasets.load_digits() # built-in to sklearn! data = digits.images.reshape((len(digits.images), -1)) # Create a classifier: a support vector classifier classifier = svm.SVC(gamma=0.001) # We learn the digits on the first half of the digits classifier.fit(data[:n_samples / 2], digits.target[:n_samples / 2])

Si está casado con openCv (posiblemente porque desea realizar un puerto a un sistema en tiempo real en el futuro), ¡opencv3 / python también tiene un tutorial sobre este tema ! Su demo usa k-neighbor-neighbor (listado en la página de LeCun), pero también tienen svms y muchas de las otras herramientas en sklearn. Su página de ocr usando SVMs usa el desajuste, que podría ser útil con el efecto de perspectiva en su problema:

ACTUALIZACIÓN: utilicé el enfoque de skimage listo para usar que se describe arriba en su imagen, muy recortado, y lo clasificó correctamente . Se necesitarán muchas más pruebas para ver si esto es rhobust en la práctica

^^ Esa pequeña imagen es la cosecha 8x8 de la imagen que incrustado en su pregunta. mnist es 8x8 imágenes. Es por eso que entrena en menos de un segundo con argumentos predeterminados en skimage.

Lo convertí al formato correcto escalando hasta el rango de mnist usando

number = scipy.misc.imread("cropped_image.png") datum = (number[:,:,0]*15).astype(int).reshape((64,)) classifier.predict(datum) # returns 8

No cambié nada más del ejemplo; aquí, solo estoy usando el primer canal para la clasificación, y no hay cómputo de funciones inteligentes. 15 me pareció perfecto; tendrás que sintonizarlo para estar dentro del rango objetivo o (idealmente) proporcionar tu propio conjunto de entrenamiento y prueba

Detección de Objetos

Si no ha aislado el número en la imagen, necesitará un detector de objetos. El espacio de la literatura sobre este problema es gigantesco y no voy a empezar por ese agujero de conejo (¿tal vez en google Viola y Jones?) Este blog cubre los fundamentos de un detector de "ventana deslizante" en python. Adrian Rosebrock parece ser un colaborador en SO, y esa página tiene algunos buenos ejemplos de detectores de objetos basados ​​en python y opencv bastante tutorializados (de hecho, no me había dado cuenta de que estaba vinculado a ese blog en su pregunta).

En resumen, clasifique ventanas en toda la imagen y elija la ventana de mayor confianza. Limitar el espacio de búsqueda con una región de interés producirá, por supuesto, grandes mejoras en todas las áreas de rendimiento