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. View Slide

  2. 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.

    View Slide

  3. 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á.

    View Slide

  4. 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

    View Slide

  5. 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.

    View Slide

  6. 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.

    View Slide

  7. 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

    View Slide

  8. 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.

    View Slide

  9. 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

    View Slide

  10. 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:

    View Slide

  11. 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()

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. Sobre Mí
    @valerybriz
    guatebot.com/blog
    Valery Calderon Briz
    #PythonMeetupGuatemala #XelaJUG

    View Slide