Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Visión por computador desde cero, Unidad 9 — Movimiento y vídeo, 9.2 — Detección de movimiento ·

Casos prácticos

Casos prácticos de detección de movimiento

Introducción

La detección de movimiento es una habilidad crucial en la visión por computador. Permite a las máquinas identificar cambios en la posición o velocidad de objetos dentro de un entorno visual, lo cual es fundamental para aplicaciones como seguridad, deportes y robótica. En este artículo, exploraremos varios casos prácticos donde la detección de movimiento desempeña un papel vital.

Explicación principal con ejemplos

La detección de movimiento se puede implementar a través del análisis de sucesivos marcos de video o imágenes. Un método común es el subtracción de fondo, donde se compara una imagen actual con una imagen de referencia (o fondo) para identificar diferencias.

Ejemplo 1: Seguridad en puertos

En este caso, la detección de movimiento puede ser utilizada para monitorear actividades anormales en un puerto marítimo. Por ejemplo:

import cv2

# Cargar video
cap = cv2.VideoCapture('puerto.mp4')

while cap.isOpened():
    ret, frame1 = cap.read()
    frame2 = cap.read()[1]
    
    # Convertir a escala de grises
    img1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)

    # Calcular diferencias
    diff = cv2.absdiff(img1, img2)

    # Aplicar umbralización para detectar movimiento
    ret, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # Mostrar resultados
    cv2.imshow('Movimiento', thresh)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Ejemplo 2: Análisis deportivo

En el ámbito del deporte, la detección de movimiento puede ayudar a analizar y mejorar el rendimiento de los atletas. Por ejemplo, en fútbol:

import cv2

# Cargar video
cap = cv2.VideoCapture('futbol.mp4')

while cap.isOpened():
    ret, frame1 = cap.read()
    frame2 = cap.read()[1]
    
    # Convertir a escala de grises y aplicar difuminado Gaussiano para suavizar ruido
    img1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.GaussianBlur(img1, (5, 5), 0)

    # Calcular diferencias y aplicar umbralización
    diff = cv2.absdiff(cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY), img2)
    ret, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # Mostrar resultados
    cv2.imshow('Movimiento', thresh)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Ejemplo 3: Robótica y navegación autónoma

En aplicaciones de robótica, la detección de movimiento puede ser utilizada para evitar colisiones o seguir un trayecto. Por ejemplo:

import cv2

# Cargar video
cap = cv2.VideoCapture('robot.mp4')

while cap.isOpened():
    ret, frame1 = cap.read()
    frame2 = cap.read()[1]
    
    # Convertir a escala de grises y aplicar difuminado Gaussiano
    img1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.GaussianBlur(img1, (5, 5), 0)

    # Calcular diferencias y aplicar umbralización
    diff = cv2.absdiff(cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY), img2)
    ret, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # Procesar los resultados para evitar colisiones o seguir trayecto
    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    for contour in contours:
        if cv2.contourArea(contour) > 100: # Ignorar pequeños objetos
            (x, y, w, h) = cv2.boundingRect(contour)
            cv2.rectangle(frame1, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # Mostrar resultados
    cv2.imshow('Movimiento', frame1)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Errores típicos / trampas

A pesar de su utilidad, la detección de movimiento presenta varios desafíos. A continuación se presentan algunos errores comunes y sus soluciones:

  1. Iluminación variable:
  • Problema: Cambios en la iluminación pueden alterar el umbral, afectando las detecciones.
  • Solución: Normalizar la iluminación utilizando técnicas como histograma igualización o ajustes de exposición.
  1. Ruido del entorno:
  • Problema: Ruido ambiental puede generar falsos positivos.
  • Solución: Aplicar filtros espaciales y temporales para reducir ruido, como los GaussianBlur en la implementación anterior.
  1. Movimiento no lineal:
  • Problema: Movimientos suaves o no lineales pueden ser difíciles de detectar.
  • Solución: Implementar algoritmos más sofisticados que puedan manejar cambios graduales, como los métodos basados en modelos estocásticos.

Checklist accionable

Para mejorar la detección de movimiento, sigue estos pasos:

  1. Normaliza la iluminación para minimizar el impacto de variaciones ambientales.
  2. Aplica técnicas de reducción de ruido como GaussianBlur o medianBlur.
  3. Implementa umbralización adecuada ajustando los valores según el entorno y el objetivo.
  4. Utiliza métodos morfológicos para eliminar pequeños artefactos no deseados en las imágenes.
  5. Evaluas y ajustas constantemente tus parámetros durante la implementación.

Cierre con "Siguientes pasos"

Siguientes pasos

  • Avanza a detección de movimiento en profundidad: Aprende sobre técnicas más avanzadas como los flujos ópticos.
  • Explora aplicaciones prácticas en robótica y seguridad, donde la detección de movimiento es crucial.
  • Participa en proyectos reales: Aplica lo aprendido en soluciones a problemas reales, mejorando tus habilidades técnicas.

¡Esperamos que este artículo te haya proporcionado una visión clara sobre cómo implementar y optimizar la detección de movimiento en tus proyectos de visión por computador!

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).