Распознаем фигуры на изображениях с Python и OpenCV
Распознавание форм на изображениях — одна из основных задач компьютерного зрения, которую можно легко реализовать с помощью библиотеки OpenCV. В этой статье мы рассмотрим, как определить основные геометрические фигуры на изображении и подписать их с использованием Python. Давайте начнем!
Шаг 1: Установка и настройка окружения
Для начала, убедитесь, что у вас установлены необходимые библиотеки. Если они отсутствуют, вы можете установить их с помощью pip:
pip install opencv-python matplotlib numpy
Шаг 2: Загрузка и предобработка изображения
Мы начнем с загрузки изображения и преобразования его в градации серого:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# Чтение изображения
img = cv2.imread('shapes.png')
# Преобразование изображения в градации серого
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Преобразование изображения в градации серого помогает упростить дальнейшую обработку и анализ.
Шаг 3: Применение пороговой обработки
Пороговая обработка позволяет преобразовать изображение в бинарное, что облегчает процесс поиска контуров:
# Установка порога для изображения в градациях серого
_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
Шаг 4: Поиск контуров
Теперь мы можем найти контуры на бинарном изображении с помощью функции findContours:
# Использование функции findContours() для нахождения контуров
contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Шаг 5: Определение и подпись фигур
На этом этапе мы будем проходить по каждому найденному контуру, определять форму и подписывать её название на изображении:
i = 0
# Список для хранения названий фигур
for contour in contours:
# Игнорируем первый контур, потому что findContours распознает все изображение как контур
if i == 0:
i = 1
continue
# Функция cv2.approxPolyDP() для аппроксимации формы
approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)
# Использование функции drawContours() для рисования контуров
cv2.drawContours(img, [contour], 0, (0, 0, 255), 5)
# Нахождение центра формы
M = cv2.moments(contour)
if M['m00'] != 0.0:
x = int(M['m10']/M['m00'])
y = int(M['m01']/M['m00'])
# Печать названия формы в центре каждой фигуры
if len(approx) == 3:
cv2.putText(img, 'Треугольник', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
elif len(approx) == 4:
cv2.putText(img, 'Четырехугольник', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
elif len(approx) == 5:
cv2.putText(img, 'Пятиугольник', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
elif len(approx) == 6:
cv2.putText(img, 'Шестиугольник', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
else:
cv2.putText(img, 'Круг', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
Шаг 6: Отображение результата
Осталось только отобразить полученное изображение:
# Отображение изображения после рисования контуров
cv2.imshow('shapes', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Теперь вы можете видеть, как программа определяет и подписывает различные фигуры на изображении. Этот процесс можно использовать в различных приложениях, таких как распознавание объектов, анализ изображений и даже в играх.
Заключение
Этот простой пример демонстрирует, как с помощью Python и библиотеки OpenCV можно решать задачи компьютерного зрения. Если вам интересно узнать больше и углубиться в эту тему, я рекомендую обратить внимание на видеокурс Написание лайфхаков на Python. В нем вы найдете множество полезных советов и примеров, которые помогут вам стать настоящим экспертом в области Python программирования.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.