Detección de objetos en imágenes

Experto
OpenCV
OpenCV
Actualizado: 21/12/2024

Introducción a Haar Cascades

Los Haar Cascades son algoritmos de detección de objetos que utilizan clasificadores en cascada basados en características simples llamadas características Haar. Estas características son patrones visuales que representan diferencias en intensidades de píxeles entre regiones adyacentes de una imagen, como bordes, líneas y cambios de textura.

La principal función de Haar Cascades es realizar detecciones rápidas y eficientes mediante una serie de clasificadores simples organizados en una estructura en cascada. Cada clasificador en la secuencia descarta regiones de la imagen que no contienen el objeto de interés, reduciendo progresivamente el número de áreas a analizar. Este proceso mejora significativamente el rendimiento, ya que se enfocan los recursos computacionales en zonas potencialmente relevantes.

Para acelerar el cálculo de las características Haar, se utiliza el concepto de imagen integral. Una imagen integral es una representación intermedia que permite calcular la suma de valores de píxeles dentro de un rectángulo en cualquier posición y escala de forma muy rápida. Esto es crucial para evaluar múltiples características y escalas en tiempo real.

El entrenamiento de un clasificador Haar Cascade implica alimentar al algoritmo con un conjunto extenso de imágenes positivas (que contienen el objeto) y negativas (que no lo contienen). A través del algoritmo de AdaBoost, se seleccionan las características más discriminativas y se ajustan los pesos para mejorar la precisión del modelo.

Detección de rostros y objetos con Haar Cascades

Para implementar la detección de rostros y objetos con Haar Cascades en OpenCV, se utilizan clasificadores pre-entrenados que están disponibles en la biblioteca. Estos clasificadores pueden cargarse y aplicarse directamente sobre imágenes para identificar objetos específicos.

Primero, es necesario cargar el clasificador Haar Cascade correspondiente al objeto que se desea detectar. OpenCV proporciona varios archivos XML pre-entrenados para diferentes objetos, como rostros, ojos y sonrisas. Los cuales se encuentran en el siguiente repositorio GitHub:  OpenCV-Haarcascades

Por ejemplo, para detectar rostros:

import cv2

# Cargar el clasificador Haar Cascade para detección de rostros
clasificador_rostros = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Es importante asegurarse de que el archivo XML del clasificador esté disponible en el directorio de trabajo o proporcionar la ruta completa al archivo.

A continuación, se carga la imagen en la que se realizará la detección y se convierte a escala de grises, ya que los clasificadores Haar Cascades funcionan sobre imágenes en escala de grises:

# Cargar la imagen
imagen = cv2.imread('imagen.jpg')

# Convertir a escala de grises
imagen_gris = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

Con la imagen en escala de grises y el clasificador cargado, se procede a detectar los objetos utilizando el método detectMultiScale:

# Detectar rostros en la imagen
rostros = clasificador_rostros.detectMultiScale(
    imagen_gris,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    flags=cv2.CASCADE_SCALE_IMAGE
)

Los parámetros más importantes son:

  • scaleFactor: Especifica en cuánto se reduce el tamaño de la imagen en cada escala. Un valor de 1.1 significa que la imagen se reduce en un 10% en cada escala.
  • minNeighbors: Define cuántos vecinos debe tener cada rectángulo candidato para ser retenido. Valores más altos resultan en menos detecciones pero más precisas.
  • minSize: Tamaño mínimo que debe tener el objeto para ser detectado.

El resultado es una lista de rectángulos donde se detectaron los rostros. Para visualizar los resultados, se pueden dibujar rectángulos sobre la imagen original:

# Dibujar rectángulos alrededor de los rostros detectados
for (x, y, w, h) in rostros:
    cv2.rectangle(imagen, (x, y), (x + w, y + h), (0, 255, 0), 2)

# Mostrar la imagen resultante
cv2.imshow('Detección de rostros', imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()

Se pueden detectar y marcar los rostros presentes en una imagen. De manera similar, se pueden cargar otros clasificadores Haar Cascade para detectar diferentes objetos, como ojos o sonrisas:

# Cargar clasificadores adicionales para ojos y sonrisas
clasificador_ojos = cv2.CascadeClassifier('haarcascade_eye.xml')
clasificador_sonrisas = cv2.CascadeClassifier('haarcascade_smile.xml')

Al detectar múltiples objetos, es recomendable realizar primero la detección de rostros y luego, dentro de cada rostro detectado, buscar otras características como ojos o sonrisas para mejorar la precisión y reducir el número de falsos positivos.

Es importante notar que la detección con Haar Cascades puede ser sensible a las condiciones de iluminación y a la orientación de los objetos. Por ello, en aplicaciones donde se requiere una mayor robustez, se pueden preprocesar las imágenes o ajustar los parámetros del detector.

Para optimizar el rendimiento, especialmente con imágenes de alta resolución, es recomendable redimensionar las imágenes antes de aplicar la detección:

# Redimensionar la imagen para acelerar la detección
resolucion = 800
alto = int(imagen.shape[0] * resolucion / max(imagen.shape))
ancho = int(imagen.shape[1] * resolucion / max(imagen.shape))
imagen_redimensionada = cv2.resize(imagen, (ancho, alto))

# Convertir a escala de grises
imagen_gris = cv2.cvtColor(imagen_redimensionada, cv2.COLOR_BGR2GRAY)

Esta práctica reduce el tiempo de procesamiento sin afectar significativamente la exactitud de la detección.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, OpenCV es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de OpenCV

Explora más contenido relacionado con OpenCV y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender los fundamentos de Haar Cascades.
  • Aprender a implementar detección de objetos con OpenCV.
  • Optimizar el reconocimiento mediante ajustes de parámetros.
  • Integrar clasificadores Haar para diferentes características como rostros, ojos y sonrisas.
  • Ejecutar detecciones en tiempo real y mejorar la precisión del modelo.