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:
- Extracción
- Representación
- 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.
Bien, comprendiendo como funciona la detección de BLOB en imágenes podemos empezar a utilizarlo.
Tabla de contenidos
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:
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: