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.



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.




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.




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.



Comentarios

Entradas populares de este blog

PRÁCTICA 2. 3D RECONSTRUCTION . PUNTOS DE INTERÉS Y EPIPOLAR

PRÁCTICA 1. FOLLOW LINE. PRUEBA 4

PRÁCTICA 2. 3D RECONSTRUCTION. MEJORA