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
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.
Definir la función de detección de pájaros
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.
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_pathes 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_pathes 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 devuelveFalse, 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. SibirdesNone, 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.
Procesar el video fotograma a fotograma
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.matchTemplatese 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:
imes el fotograma actual del video.birdes la imagen de plantilla (en este caso, la imagen del pájaro que estamos buscando).cv2.TM_CCOEFFes el método utilizado para la coincidencia de plantillas. Hay varios métodos disponibles en OpenCV, peroTM_CCOEFFes 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.minMaxLocse 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_locnos 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.
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. 255establece el color del rectángulo (blanco en este caso).2es el grosor de las líneas del rectángulo.
- Los parámetros
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_textes 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), 1establecen 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.
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.
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
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.



