Введение
Этот проект предназначен для обучения вам способу обнаружения персонажа 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.



