Detección de objetos mediante color
- publicado por Ing. Jesús Martínez
- Fecha mayo 31, 2023
Contenido:
- Introducción
- Aplicaciones de la detección de objetos mediante color
- Programando nuestro detector de objetos
- Resultados
- Conclusión
Introducción:
La detección de objetos mediante el uso de color es una técnica fascinante y ampliamente utilizada en el campo de la visión por computadora. A través del análisis de los componentes de color de una imagen, es posible identificar y localizar objetos de interés basándose en los rangos de color especificados. Esta técnica ofrece una forma eficiente y precisa de detectar objetos en diversas aplicaciones, desde el seguimiento de objetos en tiempo real hasta la clasificación automatizada en la industria.
La detección de objetos mediante color aprovecha la naturaleza distintiva de los colores para separar y segmentar regiones de interés en una imagen. Al establecer rangos de color que representan los objetos deseados, el algoritmo de detección puede analizar cada píxel y determinar si pertenece a un objeto objetivo o no. Esto brinda una herramienta invaluable en campos como la robótica, la vigilancia, la automatización industrial y muchas otras áreas donde la identificación y seguimiento de objetos son fundamentales.
Aplicaciones de la detección de objetos mediante color:
La detección de objetos mediante el uso de color ha demostrado ser una técnica extremadamente útil en una variedad de aplicaciones. Su capacidad para identificar objetos basándose en características de color específicas ha abierto nuevas posibilidades en diferentes campos. A continuación, exploraremos algunas de las aplicaciones más destacadas de esta técnica:
- Robótica: La detección de objetos mediante color es fundamental en la robótica, donde los robots utilizan la información del color para reconocer y manipular objetos. Por ejemplo, en aplicaciones de recolección automatizada, los robots pueden identificar y recoger objetos específicos según su color, agilizando los procesos de clasificación y embalaje en entornos industriales.
- Industria automotriz: En la industria automotriz, la detección de objetos mediante color se utiliza en sistemas de visión para identificar componentes o elementos específicos en la línea de producción. Esto permite una inspección más precisa y eficiente, asegurando la calidad y evitando errores en el ensamblaje de vehículos.
- Seguimiento de objetos: La detección de objetos basada en color es ampliamente utilizada en aplicaciones de seguimiento de objetos en tiempo real. Por ejemplo, en sistemas de video vigilancia, la detección de personas o vehículos mediante el color puede ayudar a identificar comportamientos sospechosos o realizar un seguimiento de la trayectoria de un objeto en movimiento.
- Automatización industrial: En entornos industriales, la detección de objetos mediante color es esencial para la automatización de procesos. Puede utilizarse para clasificar productos en función de su color, detectar fallas o anomalías en piezas fabricadas y controlar la orientación o posición de objetos durante la manipulación automatizada.
- Realidad aumentada: En el ámbito de la realidad aumentada, la detección de objetos mediante color desempeña un papel crucial. Permite identificar y rastrear elementos en el entorno físico, lo que facilita la superposición de elementos virtuales de manera precisa y realista. Esta capacidad se utiliza en aplicaciones de juegos, publicidad interactiva, diseño de interiores y muchas otras áreas.
Programando nuestro detector de objetos
Importar las librerías:
Comenzaremos por importar las bibliotecas necesarias, en este caso se trata de OpenCV y Numpy
import cv2
import numpy as np
Creación de los trackbar:
Como en este ejemplo vamos a trabajar con trackbars para la selección de los colores que queremos detectar, estaremos haciendo uso de createTrackbar
(), la cual nos solicita el nombre con el cual se identificará al trackbar, el nombre de la ventana en la cual se graficará, los valores limites y una función que se estará ejecutando en cada cambio de valor del trackbar. Como para este ejemplo no necesitamos una función de callback para cada cambio del trackbar, definiremos una función que en su interior solo tendrá un pass.
# Función de callback para el cambio de los valores de los trackbars
def on_trackbar(val):
pass
# Crear una ventana para mostrar la imagen
cv2.namedWindow('Bounding Boxes')
# Crear los trackbars para seleccionar los valores mínimos y máximos de H, S y V
cv2.createTrackbar('Hue Min', 'Bounding Boxes', 0, 179, on_trackbar)
cv2.createTrackbar('Hue Max', 'Bounding Boxes', 0, 179, on_trackbar)
cv2.createTrackbar('Saturation Min', 'Bounding Boxes', 0, 255, on_trackbar)
cv2.createTrackbar('Saturation Max', 'Bounding Boxes', 0, 255, on_trackbar)
cv2.createTrackbar('Value Min', 'Bounding Boxes', 0, 255, on_trackbar)
cv2.createTrackbar('Value Max', 'Bounding Boxes', 0, 255, on_trackbar)
Carga de la imagen a analizar:
Ahora toca el turno de cargar la imagen que deseamos analizar, es decir, la imagen que contiene los objetos a detectar, para ello utilizaremos cv2.imread()
# Cargar la imagen
image = cv2.imread('taparrosca.jpg')
Obtención de los valores de los trackbar:
Para esta fase necesitaremos la función cv2.getTrackbarPos()
, la cual nos permitirá conocer los valores actuales de cada uno de los trackbar, esta función requiere el nombre del trackbar y la ventana en la cual se está manipulando.
Es importante mencionar que como deseamos leer los valores de los trackbar una y otra vez, esta función cv2.getTrackbarPos()
se encontrará dentro de un ciclo while.
while True:
# Obtener los valores actuales de los trackbars
hue_min = cv2.getTrackbarPos('Hue Min', 'Bounding Boxes')
hue_max = cv2.getTrackbarPos('Hue Max', 'Bounding Boxes')
saturation_min = cv2.getTrackbarPos('Saturation Min', 'Bounding Boxes')
saturation_max = cv2.getTrackbarPos('Saturation Max', 'Bounding Boxes')
value_min = cv2.getTrackbarPos('Value Min', 'Bounding Boxes')
value_max = cv2.getTrackbarPos('Value Max', 'Bounding Boxes')
Conversión de BGR a HSV:
Expliquemos un poco el porqué de la conversión de BGR a HSV. Dentro del contexto de la detección de objetos mediante color, la conversión a HSV nos es beneficiosa por varias razones. En primer lugar, el canal de matiz, en este caso HUE, nos permite identificar rangos específicos de colores, esto debido a que representa el tipo de color dominante sin tener en cuenta la luminosidad. Esto nos es sumamente útil cuando se busca algún objeto de cierto color en particular, independientemente de su brillo o intensidad.
En segundo lugar, el canal de saturación nos ayuda a capturar la pureza o intensidad del color. Es decir que, al ajustar los límites de saturación, se puede definir qué tan intenso debe ser el color para que sea considerado en la detección.
Por último, el canal de valor se refiere a la luminosidad o brillo del color. Al definir limites en este canal, podemos controlar que tan claro u obscuro debe ser el objeto para ser detectado.
En pocas palabras nos es más conveniente la utilización del espacio de color HSV que el BGR, esto debido a que en el espacio BGR el color se representa solamente mediante la combinación de intensidades de cada uno de los canales de color. Ojo, no decimos que en el 100% de los casos siempre sea recomendable el uso de HSV, siempre debes utilizar lo que mejor se adapte a tu proyecto y necesidades.
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
Construcción de la máscara:
Para aislar el objeto de interés en función de su color, se definen dos vectores: uno que contiene los valores mínimos de Matiz, Saturación y Brillo, y otro que contiene los valores máximos correspondientes. Estos valores se establecen utilizando los trackbars presentes en la interfaz gráfica.
A continuación, se aplica la función cv2.inRange()
para obtener la máscara. Esta función toma como entrada la imagen en el espacio de color HSV y los valores mínimos y máximos previamente definidos. El resultado es una máscara en la que el objeto de interés se muestra en blanco, mientras que el resto de la imagen aparece en negro.
En resumen, el proceso de utilizar cv2.inRange()
nos permite obtener una máscara que resalta únicamente el objeto que queremos detectar, al pintarlo completamente de blanco en la máscara y el resto de los píxeles de la imagen en negro. Esta máscara se utilizará posteriormente para identificar y delimitar con precisión el objeto de interés en la imagen original.
# Crear una máscara utilizando el rango de color especificado
lower_color = np.array([hue_min, saturation_min, value_min])
upper_color = np.array([hue_max, saturation_max, value_max])
color_mask = cv2.inRange(hsv_image, lower_color, upper_color)
Búsqueda de contornos y dibujo del bounding box:
En esta última fase, solo nos resta encontrar el contorno que rodea el objeto detectado mediante color, esto lo realizaremos con la función cv2.findContours()
a la cual le pasamos la máscara, el método de extracción de contornos y la manera en la cual se almacenarán los puntos que componen el contorno.
# Encontrar los contornos de los objetos que coinciden con el color
contours, _ = cv2.findContours(color_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Después de obtener los contornos de los objetos de interés, el siguiente paso es dibujar las bounding boxes alrededor de los objetos detectados. Para lograr esto, se utiliza un ciclo for
que recorre cada uno de los contornos encontrados en la imagen.
Dentro del ciclo, se obtienen las coordenadas (x, y) y las dimensiones (ancho y alto) de cada contorno mediante la función cv2.boundingRect()
. Estas coordenadas y dimensiones se utilizan para definir el rectángulo que representa la bounding box alrededor del objeto.
Luego, se utiliza la función cv2.rectangle()
para dibujar el rectángulo en la imagen original, utilizando las coordenadas y dimensiones obtenidas. Esto se realiza iterativamente para cada contorno, lo que resulta en la visualización de todas las bounding boxes correspondientes a los objetos detectados.
# Dibujar una bounding box alrededor de cada objeto
image_with_boxes = image.copy()
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image_with_boxes, (x, y), (x + w, y + h), (0, 255, 0), 2)
Posteriormente solo mostramos la imagen resultante, la cual recordemos se estará actualizando siempre dentro del ciclo while.
# Mostrar la imagen original con las bounding boxes
cv2.imshow('Bounding Boxes', image_with_boxes)
# Salir del bucle si se presiona la tecla 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Liberar los recursos y cerrar las ventanas
cv2.destroyAllWindows()
Resultados:
Una vez implementado el código podemos observar cómo de una manera sencilla podemos detectar objetos dependiendo de su color, para este ejemplo te dejo de dejo los valores de los trackbar para 3 de los objetos mostrados, te llevas de tarea encontrar los dos siguientes, coméntanos en la sección de comentarios tus hallazgos y comparemos resultados con los demás miembros de la comunidad.
Color | Hue Min | Hue Max | Sat Min | Sat Max | Val Min | Val Max |
Verde | 48 | 93 | 73 | 168 | 102 | 143 |
Amarillo | 24 | 31 | 241 | 255 | 246 | 255 |
Azul | 99 | 108 | 238 | 255 | 219 | 255 |
Conclusión:
La detección de objetos mediante color tiene numerosas aplicaciones en diversos campos. Desde la automatización industrial hasta la robótica, pasando por la vigilancia y el seguimiento de objetos en tiempo real, esta técnica ofrece un amplio abanico de posibilidades.
Una de las ventajas de la detección de objetos mediante color es su relativa simplicidad de implementación. Sin embargo, es importante tener en cuenta las limitaciones de esta técnica. La detección de objetos mediante color depende en gran medida de la iluminación y las condiciones ambientales. Además, puede haber dificultades cuando existen objetos con colores similares al objeto de interés.
Código y material exclusivo
Debes estar registrado para acceder al material exclusivo Registrarme
Soy un apasionado por la innovación tecnológica, el desarrollo y el emprendimiento. Durante mi educación superior me enfoqué en la programación de software para visión artificial e inteligencia artificial. Poco después al graduarme tuve la oportunidad de aplicar estos conocimientos en el desarrollo de soluciones para empresas como General Motors, Ford, Harley-Davidson, Mack, Tesla y unas cuantas empresas más del ramo automotriz.