Detectar Flappy Bird en Vídeo con OpenCV

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Este proyecto está diseñado para enseñarte a detectar el personaje de Flappy Bird en un video utilizando el método cv2.matchTemplate proporcionado por OpenCV, una poderosa biblioteca para el procesamiento de imágenes y la visión por computadora. La función cv2.matchTemplate es una herramienta útil para la coincidencia de plantillas, que es una técnica en el procesamiento de imágenes digitales para encontrar pequeñas partes de una imagen que coincidan con una imagen de plantilla. En este proyecto, crearemos un proyecto de Python que aplique este método para detectar el personaje de Flappy Bird en un video, lo que lo convierte en un ejemplo práctico para principiantes e intermediarios en Python y OpenCV.

👀 Vista previa

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo importar y utilizar la biblioteca OpenCV para el procesamiento de imágenes.
  • Cómo escribir una función para procesar datos de video e imágenes.
  • Cómo implementar la coincidencia de plantillas para la detección de objetos en marcos de video.
  • Cómo anotar y mostrar los resultados en un video.

🏆 Logros

Después de completar este proyecto, podrás:

  • Utilizar OpenCV para tareas básicas de procesamiento de imágenes y video.
  • Aplicar técnicas de coincidencia de plantillas para detectar objetos en datos de video.
  • Anotar y visualizar los resultados de la detección de objetos en video.

Crear archivos del proyecto

Comienza preparando tu espacio de trabajo del proyecto. Crea un archivo de script de Python llamado bird_detection.py.

touch bird_detection.py

Además, asegúrate de tener un archivo de video (por ejemplo, flappybird.mp4) y un archivo de imagen del pájaro (por ejemplo, bird.png) en tu directorio de proyecto. Estos archivos se utilizarán para detectar el pájaro en el video.

Estructura del directorio del proyecto

proyecto/

├── bird_detection.py ## Tu script de Python
├── flappybird.mp4 ## Archivo de video para procesar
└── bird.png ## Imagen del pájaro para detectar en el video

✨ Revisar Solución y Practicar

Importar OpenCV

En bird_detection.py, comienza importando la biblioteca OpenCV. Esta biblioteca proporciona funciones para el procesamiento de imágenes y la visión por computadora.

import cv2

Al importar cv2, tenemos acceso a todas las funcionalidades de OpenCV.

✨ Revisar Solución y Practicar

Definir la función de detección de pájaro

Define una función llamada find_and_display_bird. Esta función tomará las rutas a un archivo de video y una imagen de pájaro, y mostrará el pájaro en cada fotograma del video.

def find_and_display_bird(video_path, bird_image_path):
    ## Function details will be added in the next steps

Esta función es el núcleo de nuestro proyecto, donde residirá la mayor parte de nuestra lógica de detección.

✨ Revisar Solución y Practicar

Cargar el video y la imagen del pájaro

En este paso, el script carga los archivos de video e imagen del pájaro utilizando OpenCV, lo cual es esencial para el proceso de detección.

    ## Cargar video e imagen del pájaro
    cap = cv2.VideoCapture(video_path)
    bird = cv2.imread(bird_image_path)

    ## Comprobar si los archivos se cargaron correctamente
    if not cap.isOpened():
        print(f"Error: No se pudo abrir el video {video_path}")
        return
    if bird is None:
        print(f"Error: No se pudo cargar la imagen del pájaro {bird_image_path}")
        return

Explicación del proceso de carga:

  • cv2.VideoCapture(video_path): Esta función se utiliza para capturar un video.
    • video_path es la ruta al archivo de video.
    • Devuelve un objeto de captura de video (cap), que te permite leer los fotogramas del video.
  • cv2.imread(bird_image_path): Esta función lee una imagen desde el archivo especificado.
    • bird_image_path es la ruta a la imagen del pájaro.
    • Devuelve la imagen (bird) en forma de matriz multidimensional, que representa los píxeles de la imagen.

Comprobar el éxito de la carga del archivo:

  • Es fundamental comprobar si los archivos de video e imagen se han cargado correctamente para evitar errores durante el procesamiento.
  • cap.isOpened(): Este método comprueba si la captura de video se ha inicializado correctamente. Si devuelve False, significa que el archivo de video no se pudo abrir.
  • if bird is None: Esta condición comprueba si la imagen del pájaro se ha cargado correctamente. Si bird es None, significa que el archivo de imagen no se pudo leer.

Cargar correctamente el video e imagen del pájaro es un paso fundamental en el proceso de detección de pájaros, ya que garantiza que los datos necesarios para el procesamiento estén accesibles y en el formato correcto.

✨ Revisar Solución y Practicar

Procesar cada fotograma del video

En este paso, el script procesa cada fotograma del video para detectar el pájaro utilizando dos funciones clave de OpenCV: cv2.matchTemplate y cv2.minMaxLoc.

    print("Procesando video...")

    ## Procesar cada fotograma del video
    while True:
        success, im = cap.read()
        if not success:
            break

        res = cv2.matchTemplate(im, bird, cv2.TM_CCOEFF)
        _, max_val, _, max_loc = cv2.minMaxLoc(res)

        ## Código de dibujo y anotación de texto se agregará en el siguiente paso

Explicación de cv2.matchTemplate:

  • cv2.matchTemplate se utiliza para la coincidencia de plantillas, un método en la visión por computadora para encontrar una sub-imagen en una imagen más grande.
  • En esta función:
    • im es el fotograma actual del video.
    • bird es la imagen de plantilla (en este caso, la imagen del pájaro que estamos buscando).
    • cv2.TM_CCOEFF es el método utilizado para la coincidencia de plantillas. Hay varios métodos disponibles en OpenCV, pero TM_CCOEFF es efectivo para este propósito ya que utiliza el coeficiente de correlación para la coincidencia.
  • La función devuelve una imagen en escala de grises res, donde cada píxel denota cuánto coincide el vecindario de ese píxel con la plantilla.

Explicación de cv2.minMaxLoc:

  • cv2.minMaxLoc se utiliza para encontrar la ubicación de los valores mínimo y máximo en una imagen en escala de grises.
  • En este contexto, se utiliza para encontrar la área de coincidencia más alta en la imagen res.
    • La función devuelve cuatro valores: el valor mínimo, el valor máximo, la ubicación del valor mínimo y la ubicación del valor máximo.
    • Para TM_CCOEFF, el valor máximo (max_val) y su ubicación (max_loc) son los que nos interesan, ya que representan el punto donde la plantilla (pájaro) tiene la coincidencia más alta.
  • max_loc nos da la esquina superior izquierda del rectángulo donde se encuentra el pájaro en el fotograma.

Al aplicar repetidamente estas dos funciones a cada fotograma del video, el script puede localizar el pájaro en cada fotograma, lo que permite la detección en tiempo real a medida que el video se reproduce. Esta es una técnica fundamental en el análisis de video y la visión por computadora, que permite la identificación y seguimiento de objetos a través de los fotogramas.

✨ Revisar Solución y Practicar

Anotar y mostrar los resultados

En este paso, el script anota y muestra cada fotograma con el área del pájaro detectado dibujando un rectángulo alrededor de él y mostrando la posición.

        ## Dibujar un rectángulo alrededor del pájaro
        left, top = max_loc
        right, bottom = left + bird.shape[1], top + bird.shape[0]
        cv2.rectangle(im, (left, top), (right, bottom), 255, 2)

        ## Agregar anotación de texto para la posición
        position_text = f"Posición: ({left}, {top})"
        cv2.putText(im, position_text, (left, top), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)

        ## Mostrar la imagen
        cv2.imshow('Detección de pájaro', im)

        ## Romper el bucle al presionar la tecla 'q'
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

Dibujar un rectángulo alrededor del pájaro:

  • cv2.rectangle(im, (left, top), (right, bottom), 255, 2): Esta función dibuja un rectángulo en el fotograma.
    • Los parámetros (left, top) y (right, bottom) definen las esquinas superior izquierda e inferior derecha del rectángulo.
    • 255 establece el color del rectángulo (blanco en este caso).
    • 2 es el grosor de las líneas del rectángulo.

Agregar anotación de texto:

  • cv2.putText: Esta función coloca texto en el fotograma.
    • Muestra la posición del pájaro en el fotograma.
    • position_text es el texto que se mostrará, mostrando la esquina superior izquierda del área del pájaro detectado.
    • La posición donde se muestra el texto se establece en (left, top) que es la esquina superior izquierda del rectángulo.
    • cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1 establecen el estilo de fuente, el tamaño, el color (blanco) y el grosor del texto.

Mostrar la imagen:

  • cv2.imshow('Detección de pájaro', im): Esta función muestra el fotograma actual con el rectángulo y las anotaciones de texto.
  • cv2.waitKey(1) & 0xFF == ord('q'): Esta línea permite que el script muestre el fotograma durante un corto tiempo y espera a que se presione la tecla 'q' para salir del bucle. Esto permite la reproducción de video en tiempo real con anotaciones.

Anotar y mostrar los resultados en tiempo real es crucial para visualizar la efectividad del proceso de detección de pájaros. Permite a los usuarios ver la detección en acción y verificar su precisión.

✨ Revisar Solución y Practicar

Liberar recursos y cerrar ventanas

Después de procesar el video, libera todos los recursos y cierra cualquier ventana abierta.

    ## Liberar recursos y cerrar ventanas
    cap.release()
    cv2.destroyAllWindows()
    print("Procesamiento de video completado.")

Este paso de limpieza es crucial para la gestión eficiente de recursos en cualquier aplicación que maneje archivos y ventanas.

✨ Revisar Solución y Practicar

Uso de ejemplo

Finalmente, se proporciona un ejemplo de cómo usar la función find_and_display_bird.

## Uso de ejemplo
if __name__ == "__main__":
    find_and_display_bird('flappybird.mp4', 'bird.png')

Ahora que hemos completado todos los pasos, podemos ejecutar el código en el entorno de escritorio usando el siguiente comando:

cd ~/project
python bird_detection.py

✨ Revisar Solución y Practicar

Resumen

En este proyecto, has aprendido cómo configurar un proyecto de Python para detectar un pájaro en un video utilizando OpenCV. Comenzando por la creación de archivos de proyecto, la importación de OpenCV, la definición de la función de detección de pájaros, la carga y el procesamiento de los fotogramas del video, la anotación y la visualización de los resultados, hasta la limpieza de recursos, has pasado por todos los pasos esenciales para construir una aplicación básica de visión por computadora. Este proyecto sirve como una habilidad fundamental en el procesamiento de imágenes y la visión por computadora utilizando Python y OpenCV.