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.
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á.
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
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.
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.
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
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.
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
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:
= 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()
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
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