PRÁCTICA 0. COLOR FILTER
En esta práctica se trata de realizar un filtro de color para detectar donde se encuentran unas pelotas en un vídeo. En concreto se ha adaptado dicho filtro a 4 vídeos (pelota_roja.avi,pelota_roja_azul.avi, drone1.mp4 y drone2.mp4).
En todos los videos se ha llevado a cabo el siguiente procedimiento:
1) Se aplica un filtro gaussiano para eliminar el ruido con cv2.GaussianBlur.
Ejemplo Filtro Gaussiano |
blur = cv2.GaussianBlur(input_image_Copy ,(3,3),1))
|
2) Se transforma la imagen al espacio de color HSV con cv2.cvtColor.
Ejemplo Cambio a HSV |
hsv=cv2.cvtColor(img,cv2.RGB2HSV))
|
3) Se realiza una umbralización en función a un rango de valores con cv2.inRange .
Ejemplo Umbralización |
bw = cv2.inRange(hsv, np.array([110,50,50]), np.array([150,100,120]))
|
4) Se usan transformaciones morfológicas para tratar de mejorar el umbralizado obtenido. Algunas de las transformaciones que se emplean son open y close.
Ejemplo Transformación Morfológica |
kernel2 = np.ones((9, 9), np.uint8) bw_close = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel) |
5) Se aplica un findcontour para detectar el contorno de la zona filtrada.
Ejemplo de Búsqueda de Contornos |
_, contours, hierarchy = cv2.findContours(thresh_close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
|
6) Se usa approxPolyDP para aproximar los contornos.
Ejemplo de Aproximación de Contornos |
c=cv2.approxPolyDP(contours,3,True);
|
7) Se usa boundingRect para detectar el rectángulo que se ajusta al contorno detectado.
Ejemplo de Bounding Rectangle |
x,y,w,h=cv2.boundingRect(c);
|
8) Finalmente se pintará un rectángulo en las pelotas detectadas y un círculo en el centro de cada pelota.
Ejemplo de como se pinta un Rectángulo y un Círculo |
cv2.rectangle(input_image_Copy,(x,y),(x+w,y+h),(255,0,0),2);
cv2.circle(input_image_Copy, (int(x+w/2),int(y+h/2)), 2, (0,0,0),2) |
Pelota_roja.avi
Para realizar la detección en este video se han usado los siguientes valores para el filtrado:
self.hmin = 100; self.hmax = 210;
self.vmin = 120; self.vmax = 255;
self.smin = 120; self.smax = 255.
En este caso me he quedado con el contorno de mayor tamaño, pues solo hay una pelota.
self.hmin = 100; self.hmax = 210;
self.vmin = 120; self.vmax = 255;
self.smin = 120; self.smax = 255.
En este caso me he quedado con el contorno de mayor tamaño, pues solo hay una pelota.
Pelota_roja_azul.avi
En este video se han usado los siguientes valores para el filtrado:
self.hmin_roja = 121; self.hmax_roja = 180;
self.vmin_roja = 81; self.vmax_roja = 255;
self.smin_roja = 175; self.smax_roja = 255;
self.hmin_blue = 47; self.hmax_blue = 152;
self.vmin_blue = 30; self.vmax_blue = 255;
self.smin_blue = 76; self.smax_blue = 255.
Al haber dos pelotas( una roja y otra azul) se ha hecho un filtro para cada color. Además se ha tenido en cuenta las dimensiones de las pelotas a la hora de estimar la posición.
self.hmin_roja = 121; self.hmax_roja = 180;
self.vmin_roja = 81; self.vmax_roja = 255;
self.smin_roja = 175; self.smax_roja = 255;
self.hmin_blue = 47; self.hmax_blue = 152;
self.vmin_blue = 30; self.vmax_blue = 255;
self.smin_blue = 76; self.smax_blue = 255.
Al haber dos pelotas( una roja y otra azul) se ha hecho un filtro para cada color. Además se ha tenido en cuenta las dimensiones de las pelotas a la hora de estimar la posición.
Drone1.mp4
La detección de las pelotas en este video ha sido más complicada debido al ruido que presentaba. Los valores de filtrado que se han empleado son:
self.hmin_roja = 158; self.hmax_roja = 178;
self.vmin_roja = 88; self.vmax_roja = 245;
self.smin_roja = 95; self.smax_roja = 205;
self.hmin_blue = 78; self.hmax_blue = 125;
self.vmin_blue = 80; self.vmax_blue = 226;
self.smin_blue = 135; self.smax_blue = 225.
Se ha tenido en cuenta el tamaño de las pelotas, descartando aquellos elementos que pudiesen ser o más grandes o más pequeños.
self.hmin_roja = 158; self.hmax_roja = 178;
self.vmin_roja = 88; self.vmax_roja = 245;
self.smin_roja = 95; self.smax_roja = 205;
self.hmin_blue = 78; self.hmax_blue = 125;
self.vmin_blue = 80; self.vmax_blue = 226;
self.smin_blue = 135; self.smax_blue = 225.
Se ha tenido en cuenta el tamaño de las pelotas, descartando aquellos elementos que pudiesen ser o más grandes o más pequeños.
Drone2.mp4
Los valores de filtrado que se han empleado son:
self.hmin = 120; self.hmax_roja = 180;
self.vmin_roja = 110; self.vmax_roja = 255;
self.smin_roja = 99; self.smax_roja = 255;
self.hmin_blue = 8; elf.hmax_blue = 127;
self.vmin_blue = 110; self.vmax_blue = 246;
self.smin_blue = 110; self.smax_blue = 255.
self.hmin = 120; self.hmax_roja = 180;
self.vmin_roja = 110; self.vmax_roja = 255;
self.smin_roja = 99; self.smax_roja = 255;
self.hmin_blue = 8; elf.hmax_blue = 127;
self.vmin_blue = 110; self.vmax_blue = 246;
self.smin_blue = 110; self.smax_blue = 255.
Comentarios
Publicar un comentario