Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduccióna la detección de objetos con SimpleCV

Introduccióna la detección de objetos con SimpleCV

Detección de Rectangulos y circulos con SimpleCV
Pueden encontrar el código de la presentación:

https://github.com/valerybriz/blobDetectSimpleCV

Valery Briz

May 26, 2017
Tweet

More Decks by Valery Briz

Other Decks in Programming

Transcript

  1. SimpleCV 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 facil.
  2. La página de la librería es simplecv.org alli podemos encontrar

    los paquetes de instalación, documentación y ejemplos practicos 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 unicamente 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á.
  3. En 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 analisis de BLOB: • Extracción • Representación • Clasificación Tomada de: Real-Time Traffic Camera Analysis
  4. 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.
  5. 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 numeros que indica la cantidad de características y luego puede ser comparado por medio de un metodo 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.
  6. Clasificación • Por último la representación anterior se compara directamente

    con un prototipo para verificar que realmente concuerda con las caracteristicas que queremos filtrar, por ejemplo en el caso anterior compararíamos los pixeles con un conjunto de pixeles que representan un rectangulo. Tomada de: Real-Time Traffic Camera Analysis
  7. 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.
  8. Para verificar que todo esté instalado correctamente vamos a probar

    el siguiente codigo, que toma la imagen de la camara y la muestra en pantalla: import SimpleCV display = SimpleCV.Display() #crear la ventana para mostrar la imagen cam = SimpleCV.Camera(0) # 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 if normaldisplay: # si esta en modo normal img.show() # mostrar la imagen else: # modo segmentado segmented.show() # mostrar la imagen segmentada
  9. import SimpleCV display = SimpleCV.Display() cam = SimpleCV.Camera(0) normaldisplay =

    True 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 #crear la ventana para mostrar la imagen # inicializar la camara # opcion de mostrar solo un segmento de pantalla si es false Si todo esta correcto deberías ver una ventana con la imagen que la camara esta captando. Ahora si, estamos listos para el código de detección:
  10. 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 # dibujamos el rectangulo img.drawRectangle(x_position, y_position, rect[-1].width(), rect[-1].height(),SimpleCV.Color.BLUE, 3 ) #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()
  11. if blobs2: # if blobs are found 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
  12. Si todo fue bien, podras ver circulos y rectangulos detectados

    en la imagen. Aqui puedes encontrar la documentación de la librería: http://simplecv.readthedocs.io/en/latest/ Aqui puedes encontrar el codígo de la librería y ejemplos: https://github.com/sightmachine/simplecv