Обнаружение Flappy Bird в видео с использованием OpenCV

PythonBeginner
Практиковаться сейчас

Введение

Этот проект предназначен для обучения вам способу обнаружения персонажа Flappy Bird в видео с использованием метода cv2.matchTemplate, предоставляемого библиотекой OpenCV, мощной библиотекой для обработки изображений и компьютерного зрения. Функция cv2.matchTemplate - это полезный инструмент для шаблонного сопоставления, которое представляет собой технику в области обработки цифровых изображений для поиска мелких частей изображения, которые совпадают с шаблонным изображением. В этом проекте мы создадим проект на Python, который применяет этот метод для обнаружения персонажа Flappy Bird в видео, сделав его практическим примером для начинающих и среднеуровневых пользователей Python и OpenCV.

👀 Предпросмотр

🎯 Задачи

В этом проекте вы научитесь:

  • Как импортировать и использовать библиотеку OpenCV для обработки изображений.
  • Как написать функцию для обработки видео и изображений.
  • Как реализовать шаблонное сопоставление для обнаружения объектов в кадрах видео.
  • Как аннотировать и отображать результаты в видео.

🏆 Достижения

После завершения этого проекта вы сможете:

  • Использовать OpenCV для основных задач обработки изображений и видео.
  • Применять методы шаблонного сопоставления для обнаружения объектов в видеоданных.
  • Аннотировать и визуализировать результаты обнаружения объектов в видео.

Создать файлы проекта

Начните с подготовки рабочего пространства для проекта. Создайте файл Python с именем bird_detection.py.

touch bird_detection.py

此外,确保在项目目录中有一个视频文件(例如 flappybird.mp4)和一个鸟类图像文件(例如 bird.png)。这些文件将用于在视频中检测鸟类。

Структура проекта

project/ │ ├── bird_detection.py ## Ваш скрипт на Python ├── flappybird.mp4 ## Видеофайл для обработки └── bird.png ## Изображение птицы для обнаружения в видео

Импортировать OpenCV

В файле bird_detection.py начните с импорта библиотеки OpenCV. Эта библиотека предоставляет функции для обработки изображений и компьютерного зрения.

import cv2

Импортируя cv2, мы получаем доступ ко всем функциям OpenCV.

Определить функцию обнаружения птицы

Определите функцию под названием find_and_display_bird. Эта функция будет принимать пути к видеофайлу и изображению птицы, и она будет отображать птицу на каждом кадре видео.

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

Эта функция является ядром нашего проекта, где будет располагаться большая часть нашей логики обнаружения.

Загрузить видео и изображение птицы

В этом шаге скрипт загружает файлы видео и изображения птицы с использованием OpenCV, что необходимо для процесса обнаружения.

    ## Load video and bird image
    cap = cv2.VideoCapture(video_path)
    bird = cv2.imread(bird_image_path)

    ## Check if files were loaded successfully
    if not cap.isOpened():
        print(f"Error: Could not open video {video_path}")
        return
    if bird is None:
        print(f"Error: Could not load bird image {bird_image_path}")
        return

Пояснение процесса загрузки

  • cv2.VideoCapture(video_path): Эта функция используется для захвата видео.
    • video_path - это путь к видеофайлу.
    • Она возвращает объект захвата видео (cap), который позволяет читать кадры из видео.
  • cv2.imread(bird_image_path): Эта функция читает изображение из указанного файла.
    • bird_image_path - это путь к изображению птицы.
    • Она возвращает изображение (bird) в виде многомерного массива, который представляет пиксели изображения.

Проверка успешной загрузки файлов

  • Важно проверить, были ли успешно загружены видеофайл и изображение, чтобы предотвратить ошибки во время обработки.
  • cap.isOpened(): Этот метод проверяет, была ли инициализирована захват видео правильно. Если он возвращает False, это означает, что видеофайл не удалось открыть.
  • if bird is None: Это условие проверяет, был ли изображение птицы загружено правильно. Если bird равен None, это означает, что файл изображения не удалось прочитать.

Корректная загрузка видео и изображения птицы - это фундаментальный шаг в процессе обнаружения птицы, так как это гарантирует, что данные, необходимые для обработки, доступны и имеют правильный формат.

Обработать кадры видео по отдельности

В этом шаге скрипт обрабатывает каждый кадр видео для обнаружения птицы с использованием двух ключевых функций OpenCV: cv2.matchTemplate и cv2.minMaxLoc.

    print("Processing video...")

    ## Process video frame by frame
    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)

        ## Drawing and text annotation code will be added in the next step

Пояснение функции cv2.matchTemplate:

  • cv2.matchTemplate используется для шаблонного сопоставления, это метод в компьютерном зрении для поиска под-изображения в большем изображении.
  • В этой функции:
    • im - текущий кадр из видео.
    • bird - шаблонное изображение (в данном случае, изображение птицы, которое мы ищем).
    • cv2.TM_CCOEFF - метод, используемый для шаблонного сопоставления. В OpenCV есть несколько методов, но TM_CCOEFF эффективен для этой цели, так как он использует коэффициент корреляции для сопоставления.
  • Функция возвращает серое изображение res, где каждый пиксель показывает, насколько окрестность этого пикселя совпадает с шаблоном.

Пояснение функции cv2.minMaxLoc:

  • cv2.minMaxLoc используется для поиска местоположения минимальных и максимальных значений в сером изображении.
  • В этом контексте она используется для поиска области с наивысшим совпадением в изображении res.
    • Функция возвращает четыре значения: минимальное значение, максимальное значение, местоположение минимального значения и местоположение максимального значения.
    • Для TM_CCOEFF интересны максимальное значение (max_val) и его местоположение (max_loc), так как они представляют точку, где шаблон (птица) имеет наивысшее совпадение.
  • max_loc дает нам верхний левый угол прямоугольника, где птица найдена в кадре.

Повторяя применение этих двух функций к каждому кадру видео, скрипт может определить местоположение птицы на каждом кадре, что позволяет осуществлять реaltime-обнаружение во время проигрывания видео. Это фундаментальный метод в анализе видео и компьютерном зрении, позволяющий идентифицировать и отслеживать объекты на протяжении кадров.

Аннотировать и отображать результаты

В этом шаге скрипт аннотирует и отображает каждый кадр с областью обнаружения птицы, рисуя вокруг нее прямоугольник и отображая позицию.

        ## Draw rectangle around the bird
        left, top = max_loc
        right, bottom = left + bird.shape[1], top + bird.shape[0]
        cv2.rectangle(im, (left, top), (right, bottom), 255, 2)

        ## Add text annotation for position
        position_text = f"Position: ({left}, {top})"
        cv2.putText(im, position_text, (left, top), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)

        ## Display the image
        cv2.imshow('Bird Detection', im)

        ## Break loop on 'q' key press
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

Рисование прямоугольника вокруг птицы:

  • cv2.rectangle(im, (left, top), (right, bottom), 255, 2): Эта функция рисует прямоугольник на кадре.
    • Параметры (left, top) и (right, bottom) определяют верхний левый и нижний правый углы прямоугольника.
    • 255 задает цвет прямоугольника (белым в данном случае).
    • 2 - толщина линий прямоугольника.

Добавление текстовой аннотации:

  • cv2.putText: Эта функция выводит текст на кадр.
    • Она отображает позицию птицы на кадре.
    • position_text - текст, который будет отображаться, показывающий верхний левый угол области обнаружения птицы.
    • Позиция, где отображается текст, установлена в (left, top), который является верхним левым углом прямоугольника.
    • cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1 задают стиль шрифта, размер, цвет (белый) и толщину текста.

Отображение изображения:

  • cv2.imshow('Bird Detection', im): Эта функция отображает текущий кадр с прямоугольником и текстовыми аннотациями.
  • cv2.waitKey(1) & 0xFF == ord('q'): Эта строка позволяет скрипту отобразить кадр на короткое время и ждать нажатия клавиши 'q' для выхода из цикла. Это позволяет осуществлять воспроизведение видео в реальном времени с аннотациями.

Реальное время аннотации и отображение результатов важны для визуализации эффективности процесса обнаружения птицы. Это позволяет пользователям увидеть процесс обнаружения в действии и проверить его точность.

Освободить ресурсы и закрыть окна

После обработки видео освободите все ресурсы и закройте все открытые окна.

    ## Release resources and close windows
    cap.release()
    cv2.destroyAllWindows()
    print("Video processing complete.")

Этот этап очистки важен для эффективного управления ресурсами в любом приложении, которое обрабатывает файлы и окна.

Пример использования

Наконец, приведите пример того, как использовать функцию find_and_display_bird.

## Example usage
if __name__ == "__main__":
    find_and_display_bird('flappybird.mp4', 'bird.png')

Теперь, когда мы завершили все шаги, мы можем запустить код в среде рабочего стола, используя следующую команду:

cd ~/project
python bird_detection.py

Резюме

В этом проекте вы узнали, как создать проект на Python для обнаружения птицы в видео с использованием OpenCV. Начиная от создания файлов проекта, импорта OpenCV, определения функции обнаружения птицы, загрузки и обработки кадров видео, аннотации и отображения результатов до очистки ресурсов, вы прошли все важные шаги для создания базового приложения компьютерного зрения. Этот проект является фундаментальным навыком в области обработки изображений и компьютерного зрения с использованием Python и OpenCV.

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться