Professional Documents
Culture Documents
AREQUIPA 2015
0
INTRODUCCIN
Las computadoras no "ven" las fotos ni los videos de la misma manera que las
personas. Cuando una persona observa una foto, puede por ejemplo reconocer a su
mejor amigo de pie delante de su casa .
Si bien una computadora no reaccionar como las personas cuando ven esa foto, es
posible entrenar a la computadora para que reconozca ciertos patrones de color y
formas. Por ejemplo, se puede entrenar a una computadora para que reconozca los
patrones comunes de formas y colores que componen la imagen digital de un rostro
por ejemplo.
Muchas de los objetos que tenemos en nuestro entorno son de forma geomtrica y
casi todos los objetos tienen un color caracterstico que nos permite a simple vista
diferenciarlos unos de otros , basados en esto es que se puede utilizar por ejemplo
la forma de un objeto y su color para lograr que un robot lo siga , si bien es cierto q
el robot no ve el objeto puede a travs de un algoritmo identificarlo en el conjunto
de datos que le llegan gracias a un sensor como por ejemplo una cmara de video.
Para lograr que el robot identifique un objeto y lo siga se hacen uso de muchos
algoritmos de procesamiento digital de imgenes.
1
INDICE
- Introduccin pag. 1
- Indice pag. 2
- Conclusiones pag. 25
- Bibliografa. pag. 26
- Anexos. pag. 27
2
PRIMER CAPTULO: MARCO TERICO
1. Adquisicin de datos
2. Extraccin de caractersticas
3. Toma de decisiones
3
OPENCV
4
PYTHON
ARDUINO
5
de desarrollo que implementa el lenguaje de programacin Processing/Wiring y
el cargador de arranque que es ejecutado en la placa.
6
SEGUNDO CAPTULO: DIAGRAMA DE BLOQUES DEL SISTEMA
ELIMINACION DE RUIDO
CONVERSION A
MASCARA DE COLOR Y DESENFOQUE
FORMATO HSV
GAUSSIANO
OBTENCION DE LA
IMAGEN
7
TERCER CAPTULO: DISEO DEL SISTEMA
En el diseo del sistema se tomaron en cuenta diversos aspectos para elegir las
herramientas adecuadas para lograr los objetivos del proyecto.
Uno de ellos era utilizar software y hardware de cdigo abierto, para ahorrar los
costes y proporcionar una idea replicable cuyas ventajas resultan ms que obvia al
utilizar software libre.
Por lo que decidimos utilizar Python como lenguaje de programacin para el
algoritmo en lugar de C y Matlab , y adems porque OpenCV la librera que
utilizaramos tiene algoritmos tanto para Python como para C por lo que combinan a
la perfeccin.
8
PROCEDIMIENTO DE ELABORACIN DEL ALGORITMO
Pasos necesarios para el reconocimiento ,deteccin de figuras y control del robot:
9
PROCESO DE DISEO
Como es de suponer necesitamos una cmara de video para obtener imgenes del
entorno para poder procesarlas .Para esta tarea elegimos una cmara de resolucin
media de marca Micronics modelo w304 la cual satisface nuestras necesidades.
Esta cmara se conecta va USB a nuestro computador lo cual facilita la obtencin
de video a una buena calidad .
import serial
import time
import cv2
import numpy as np
ser=serial.Serial('COM3',9600,timeout=0)
captura=cv2.VideoCapture(1)
Con esta parte del algoritmo tenemos llamadas las libreras que utilizaremos y se
inici la captura de frames de la cmara de video; el numero 1 indica al programa
que debe utilizar la cmara externa y no la cmara de la laptop.
Adems se inicia el puerto serial COM3 que es donde se conecta nuestro Arduino
a 9600 baudios.
10
2. DECIDIR QUE OBJETO Y DE QUE COLOR SE DESEA DETECTAR
Por medio de una consola se pide al usuario que le diga al robot que figura debe
seguir y de qu color de esta manera el robot sabr que objeto buscar.
En base a estos dos datos se cre una pequea tabla con los valores respectivos
de los colores y del nmero de vrtices de los objetos, en este caso usaremos los
3 colores bsicos (rojo,azul y verde)y dos tipos de figuras cuadrados y tringulos.
if tipofigura == 'triangulo':
numerodevertices = 3
if tipofigura == 'cuadrado':
numerodevertices = 4
if colorfigura == 'azul':
#colores hsv(azules)
bajos=np.array([67,40,105],dtype=np.uint8)
altos=np.array([129,255,182],dtype=np.uint8)
if colorfigura == 'verde':
#colores hsv(verdes)
bajos = np.array([49,50,50],dtype=np.uint8)
altos = np.array([80, 255,
255],dtype=np.uint8)
if colorfigura == 'rojo':
#colores hsv(verdes)
bajos = np.array([0,20,20], dtype=np.uint8)
11
altos = np.array([20,255,255],
dtype=np.uint8)
Estos valores son cargados en unas variables dependiendo de la eleccion las cuales
sern utilizadas por el algoritmo luego para detectar los colores y las formas.
Debido a que la deteccin del objeto est basado primero que nada en su color se
utiliz el formato HSV en lugar del RGB ya que es ms fcil analizar las imgenes
y sus colores de esta manera.
El modelo HSV (del ingls Hue, Saturation, Value Matiz, Saturacin, Valor),
tambin llamado HSB (Hue, Saturation, Brightness Matiz, Saturacin, Brillo),
define un modelo de color en trminos de sus componentes.
El modelo HSV fue creado en 1978 por Alvy Ray Smith. Se trata de una
transformacin no lineal del espacio de color RGB, y se puede usar en progresiones
de color.
Se inicia un bucle infinito de tipo while para que cada frame de la cmara sea
analizado y procesado de manera de poder identificar los colores y las formas.
while (1):
#captura imagen
_,imagen=captura.read()
#convertir a hsv
hsv=cv2.cvtColor(imagen,cv2.COLOR_BGR2HSV)
12
4. CREAR LA MSCARA DE UN COLOR
Para que la deteccin sea mas efectiva se eliminaran aquellos grupos de pixeles
pequeos ya que se supone que si son muy pequeos no son objetos que deseemos
seguir .Para lograr esto se usa un filtro de OpenCV.
mask=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)
mask=cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)
13
El desenfoque gaussiano es un efecto de suavizado para mapas de bits generado
por software de edicin grfica.
El efecto es generado por medio de algoritmos matemticos. En esencia, el efecto
mezcla ligeramente los colores de los pxeles que estn vecinos el uno al otro en un
mapa de bits (imagen), lo que provoca que la imagen pierda algunos detalles
minsculos y, de esta forma, hace que la imagen se vea ms suave (aunque menos
ntida o clara) respecto a que los bordes presentes en la imagen se ven afectados.
#Desenfoque Gaussiano
blur=cv2.GaussianBlur(mask,(5,5),0)
14
7. APLICAR UN CANNY EDGE A LA MSCARA:
El detector de Canny Edge fue desarrollado por John F. Canny en 1986. Tambin
conocido por muchos como el detector ptimo , el algoritmo de Canny pretende
satisfacer tres criterios principales :
Baja tasa de error : Significa una buena deteccin de solo bordes existentes .
Buena localizacin : La distancia entre los pxeles del borde detectado y borde
verdadero es mnima.
Respuesta mnima : Slo una respuesta del detector al borde.
PASOS:
Filtrar cualquier ruido. El filtro de Gauss se usa para este propsito. Un ejemplo
de un kernel gaussiana de tamao = 5 que podra ser utilizado se muestra a
continuacin:
15
Encontrar la fuerza del gradiente y la direccin con:
La direccin se redondea a uno de los cuatro ngulos posibles (es decir, 0, 45, 90 o
135)
Se aplica no supresin mxima. Esto elimina los pxeles que no se consideran
parte de un borde. Por lo tanto, slo las lneas finas (bordes candidatos) se
mantendrn.
Histresis: El paso final. Canny hace uso de dos umbrales (superior e inferior):
Si un gradiente de pixel es mayor que el umbral superior, el pxel se acepta como un
borde.
Si un valor de gradiente pxel est por debajo del umbral inferior, entonces se
rechaza.
Si el gradiente de pxel es entre los dos umbrales, entonces ser aceptada slo si
est conectado a un pxel que est por encima del umbral superior.
Canny recomend un superior: relacin ms baja entre 2: 1 y 3: 1.
16
8. DETECTAR LOS DIFERENTES CONTORNOS:
#Deteccion de contornos
contours,hier=cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APP
ROX_SIMPLE)
areas=[cv2.contourArea(c) for c in contours]
Contours es una lista que contiene otras listas, cada una de las cuales contiene
todas las coordenadas de los puntos de cada contorno
Hier guarda la jerarqua de los contornos. La jerarqua ayuda a establecer qu
contornos pertenecen a un mismo objeto, cules son ms importantes, etc.
cv2.findContours recibe 3 parmetros. El primero es la mscara dnde hay que
buscar los contornos. El segundo es el mtodo para establecer la jerarqua. El tercer
parmetro es el algoritmo utilizado para reducir el nmero de puntos del contorno.
En la segunda lnea calculamos el rea con un bucle que va iterando entre las listas
de puntos de contours y guarda su rea en una lista.
Solo aquellos objetos de mas de 500 pixeles deben ser tomados en cuenta
approx=cv2.approxPolyDP(actual,0.05*cv2.arcLength(a
ctual,True),True)
if len(approx)== numerodevertices :
cv2.drawContours(imagen,[actual],0,(0,0,255),2)
Ahora llega la parte de determinar si el objeto del color que ha detectado tiene
tambin la forma que queremos para lo cual se calcula el nmero de vrtices por
medio de una aproximacin y si coincide con el nmero de vrtices de la forma que
elegimos le dibuja un contorno .
En este momento ya se logr detectar el objeto que desebamos seguir.
moments=cv2.moments(mask)
area = moments['m00']
x = int(moments['m10']/moments['m00'])
y = int(moments['m01']/moments['m00'])
cv2.rectangle(imagen,(x,y),(x+2,y+2),(0,0,255),2)
18
Imagen nro 6 Objeto detectado y centro marcado
Como ya tenemos las coordenadas del centro del objeto ya podemos ordenarle a
nuestro robot hacia dnde dirigirse.
Estas rdenes se las damos a travs del puerto serial.
Se dividi al plano de visin del robot en 3 partes de aproximadamente el mismo
tamao , en este caso de 200 pixeles cada uno para hacer los 600 pixeles de ancho
que tiene la imagen.
Dependiendo de la ubicacin del centro del objeto ,con respecto a las 3 divisiones
se mandan las ordenes derecha, izquierda o de frente.
if (area>1000000):
if (x>400):
print"derecha x=",x,"y=",y
ser.write("i")
elif (0<x<200):
print"izquierda x=",x,"y=",y
ser.write("d")
elif (200<x<400):
print"de frente x=",x,"y=",y
ser.write("f")
else:
ser.write("m")
print"detente"
19
PROGRAMA DE CONTROL DEL ROBOT CON ARDUINO:
#define LED 13
#define M1A 11
#define M1B 10
#define M2A 6
#define M2B 5
int mssg=0;
void setup()
{pinMode(LED,OUTPUT);
pinMode(M1A,OUTPUT);
pinMode(M1B,OUTPUT);
pinMode(M2A,OUTPUT);
pinMode(M2B,OUTPUT);
Serial.begin(9600);
void loop()
{
if(Serial.available()>0)
{mssg=Serial.read();
if(mssg=='b'){
digitalWrite(LED,HIGH);
analogWrite(M1A,0);
analogWrite(M1B,0);
analogWrite(M2A,180);
analogWrite(M2B,0);
20
if(mssg=='f'){
digitalWrite(LED,HIGH);
analogWrite(M1A,180);
analogWrite(M1B,0);
analogWrite(M2A,180);
analogWrite(M2B,0);
else if(mssg=='r')
{
digitalWrite(LED,HIGH);
analogWrite(M1A,0);
analogWrite(M1B,180);
analogWrite(M2A,0);
analogWrite(M2B,180);
}
else if(mssg=='d')
{
digitalWrite(LED,HIGH);
analogWrite(M1A,180);
analogWrite(M1B,0);
analogWrite(M2A,0);
analogWrite(M2B,0);
}
else if(mssg=='i')
{
digitalWrite(LED,HIGH);
analogWrite(M1A,0);
analogWrite(M1B,0);
analogWrite(M2A,180);
analogWrite(M2B,0);
}
else if (mssg=='p')
{
digitalWrite(13,HIGH);
analogWrite(M1A,0);
analogWrite(M1B,0);
analogWrite(M2A,0);
analogWrite(M2B,0);
21
CUARTO CAPTULO: PRUEBAS
Las pruebas se realizaron en un ambiente bien iluminado sin exceso de luz y con
fondo variable.
Los objetos fueron colocados a aproximadamente dos metros de distancia del robot
.
22
Se pudo comprobar que algunos colores eran ms fciles de detectar debido a las
variaciones en la intensidad del color debido al reflejo de la luz en su superficie y la
sombra.
23
Se tuvo que controlar la velocidad de los motores del robot con PWM para que su
movimiento fuera ms preciso y evitar de esta forma que el robot pierda el foco en
el objeto.
En la mayora de las pruebas el resultado fue satisfactorio. Aunque a veces el hecho
de utilizar cables para la transferencia de informacin limitaba el movimiento del
robot y produca movimientos inesperados.
Este problema podra solucionarse haciendo uso de transmisin inalmbrica de
datos.
24
CONCLUSIONES
25
BIBLIOGRAFA
https://es.wikipedia.org/wiki/Modelo_de_color_HSV Articulo en
Wikipedia sobre el modelo de color HSV
26
ANEXOS
Vista frontal
Vista Lateral
27
Vista inferior
Vista superior
28