reconocimiento-imagen

El día de hoy vamos a aprender como detectar algunas formas/objetos con la librería SimpleCV.

SimpleCV es un framework open source para desarrollar aplicaciones de Computer Vision. con el podremos tener acceso a una gran cantidad de librerías de Computer Vision como OpenCV, sin tener que aprender a profundidad sobre formatos de archivos, espacio de colores, manejo de buffer y otros.

En Resumen SimpleCV es utilización de Computer Vision de manera fácil.

La página de la librería es simplecv.org alli podemos encontrar los paquetes de instalación, documentación y ejemplos prácticos sobre como utilizarla. En este caso para poder reconocer las formas vamos a utilizar principalmente una función de SimpleCV llamada “FindBlobs()”.

la palabra BLOB viene de las iniciales de Binary Large OBject que se refiere a un grupo de pixeles conectados en una imagen. El termino Large o Largo indica que únicamente los objetos de cierto tamaño serán tomados en cuenta y los que no cumplan con esta especificación se tomará como “Ruido” y simplemente se ignorará.

Tomada de: Real-Time Traffic Camera AnalysisEn la anterior imagen del lado derecho podemos notar en blanco las diferencias en color respecto al fondo y del lado izquierdo podemos notar los BLOBS que han cumplido con las características que necesitamos.

Existen tres procedimientos principales en el análisis de BLOB:

  1. Extracción
  2. Representación
  3. Clasificación

Extracción:

En esta parte del procesamiento se encuentran los pixeles conectados entre si osea pixeles vecinos que coinciden con las especificaciones, para lograrlo usualmente se utilizan algoritmos como el algoritmo Grass-Fire Recursivo o el algoritmo Grass-Fire Secuencial, en esta ocasión no profundizaremos al respecto.

Representación:

La siguiente etapa es la de representar las características de los pixeles que hemos extraído anteriormente, esto se hace por medio de números que indica la cantidad de características y luego puede ser comparado por medio de un método para asegurarse de que cumple con las características propuestas, por ejemplo si es un rectángulo, los pixeles deben representar cuatro lineas intercontectadas, dos paralelas entre si horizontalmente y dos paralelas entre si verticalmente.

Clasificación:

Por último la representación anterior se compara directamente con un prototipo para verificar que realmente concuerda con las características que queremos filtrar, por ejemplo en el caso anterior compararíamos los pixeles con un conjunto de pixeles que representan un rectángulo.

Tomada de: Real-Time Traffic Camera Analysis

Bien, comprendiendo como funciona la detección de BLOB en imágenes podemos empezar a utilizarlo.

Tensor Flow Object Detection sobre Telegram Bot, mi desayuno, frutas y una conversación interactiva

En este artículo vamos a explorar un caso donde combinemos la detección de objetos en imágenes utilizando Tensor Flow…

planetachatbot.com

Para poder utilizar SimpleCV de nuevo se nos facilitan mucho las cosas pues podemos descargar el paquete completo de requerimientos y archivos de la librería especificos para el sistema operativo que utilices:

SimpleCV version 1.3

Luego de la descarga simplemente seguimos los pasos de la instalación dejando lo que nos sugieren por default.

Para verificar que todo esté instalado correctamente vamos a probar el siguiente código, que toma la imagen de la cámara y la muestra en pantalla:

import SimpleCV  display = SimpleCV.Display() #crear la ventana para mostrar la imagen  cam = SimpleCV.Camera(1) # inicializar la camara  normaldisplay = True # opción de mostrar solo un segmento de pantalla si es false  while display.isNotDone(): # ciclo hasta que detengamos el programa  if display.mouseRight: # si el hacemos click derecho cambiar de modo  normaldisplay = not(normaldisplay)  print "Modo de Ventana:", "Normal" if normaldisplay else "Segmentado"  img = cam.getImage().flipHorizontal() # obtenemos una imagen de la camara  if normaldisplay: # si esta en modo normal  img.show() #mostrar la imagen  else: # modo segmentado  segmented.show() #mostrar la imagen

Si todo esta correcto deberías ver una ventana con la imagen que la cámara esta captando.

Ahora si, estamos listos para el código de detección:

import SimpleCV  display = SimpleCV.Display() #crear la ventana para mostrar la imagen  cam = SimpleCV.Camera(1) # inicializar la camara  normaldisplay = True # opcion de mostrar solo un segmento de pantalla si es false  while display.isNotDone(): # ciclo hasta que detengamos el programa  if display.mouseRight: # si el hacemos click derecho cambiar de modo  normaldisplay = not(normaldisplay)  print "Modo de Ventana:", "Normal" if normaldisplay else "Segmentado"  img = cam.getImage().flipHorizontal() # obtenemos una imagen de la camara  dist = img.colorDistance(SimpleCV.Color.BLACK).dilate(5) # separamos los colores que estamos obteniendo en la imagen  segmented = dist.stretch(220,255) #tratamos de sacar los colores blancos  blobs = segmented.findBlobs() #buscamos objetos o BLOBs en la imagen  if blobs: #Si encontramos BLOBs  circles = blobs.filter([b.isCircle(0.2) for b in blobs]) # filtramos unicamente los objetos con forma de circulo  if circles:  img.drawCircle((circles[-1].x, circles[-1].y), circles[-1].radius(),SimpleCV.Color.BLUE,3) # dibujamos el circulo encontrado  rect = blobs.filter([b.isRectangle(0.1) for b in blobs]) # filtramos por rectangulos  if rect:  x_position = rect[-1].x-rect[-1].width()/2 #obtenemos la posicion en x  y_position = rect[-1].y-rect[-1].height()/2 #obtenemos la posicion en y  img.drawRectangle(x_position, y_position, rect[-1].width(), rect[-1].height(),SimpleCV.Color.BLUE, 3 ) # dibujamos el rectangulo  #Lo siguiente que hacemos es el mismo procedimiento pero en vez de obtener objetos con colores claros obtendremos objetos con colores oscuros  dist2 = img.colorDistance(SimpleCV.Color.WHITE).dilate(5)  segmented2 = dist2.stretch(200,255) # tratamos de sacar los colores oscuros  blobs2 = segmented2.findBlobs()  if blobs2:  circles2 = blobs2.filter([b2.isCircle(0.2) for b2 in blobs2])  if circles2:  img.drawCircle((circles2[-1].x, circles2[-1].y), circles2[-1].radius(),SimpleCV.Color.RED,3)  rect = blobs2.filter([b2.isRectangle(0.8) for b2 in blobs2])  if rect:  x_position = rect[-1].x-rect[-1].width()/2  y_position = rect[-1].y-rect[-1].height()/2  img.drawRectangle(x_position, y_position, rect[-1].width(), rect[-1].height(),SimpleCV.Color.RED, 3 )  if normaldisplay: # si esta en modo normal  img.show() # mostrar la imagen  else: # modo segmentado  segmented.show() # mostrar la imagen segmentada

Si todo fue bien, podrás ver círculos y rectángulos detectados en la imagen.

Aquí puedes encontrar la documentación de la librería:

http://simplecv.readthedocs.io/en/latest/

Aquí puedes encontrar el código de la librería y ejemplos:

https://github.com/sightmachine/simplecv

Por Valery Calderon Briz

Data Team Lead at Fairplay.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *