Рисование геометрических фигур с помощью OpenCV и NumPy
OpenCV предоставляет богатый набор функций для рисования геометрических фигур на изображениях. Эти функции используются для аннотации изображений, создания масок, визуализации результатов детектирования и многих других задач компьютерного зрения. В сочетании с NumPy для создания и манипуляции изображениями, OpenCV позволяет эффективно работать с графическими примитивами.
Рисование геометрических фигур с помощью OpenCV и NumPy
Введение
OpenCV предоставляет богатый набор функций для рисования геометрических фигур на изображениях. Эти функции используются для аннотации изображений, создания масок, визуализации результатов детектирования и многих других задач компьютерного зрения. В сочетании с NumPy для создания и манипуляции изображениями, OpenCV позволяет эффективно работать с графическими примитивами.
Инициализация и создание изображения
Для начала работы необходимо импортировать библиотеки и создать черное изображение:
1
2
3
4
5
6
import cv2
import numpy as np
# Создание черного изображения размером 200x200 пикселей
# 3 канала для цветного изображения (BGR)
image = np.zeros((200, 200, 3), np.uint8)
Рисование линии
Функция cv2.line() рисует отрезок между двумя точками:
1
2
3
4
# Рисование красной линии от (0,199) до (199,0)
# Цвет: (B, G, R) = (0, 0, 255) - красный
# Толщина: 2 пикселя
cv2.line(image, (0, 199), (199, 0), (0, 0, 255), 2)
Рисование прямоугольника
Прямоугольник задается двумя противоположными вершинами:
1
2
3
4
5
# Рисование синего прямоугольника
# Левый верхний угол: (20, 20), правый нижний: (60, 60)
# Цвет: (255, 0, 0) - синий
# Толщина: 1 пиксель
cv2.rectangle(image, (20, 20), (60, 60), (255, 0, 0), 1)
Рисование круга
Круг определяется центром и радиусом:
1
2
3
4
5
# Рисование зеленого залитого круга
# Центр: (80, 80), радиус: 10 пикселей
# Цвет: (0, 255, 0) - зеленый
# Толщина: -1 (заливка)
cv2.circle(image, (80, 80), 10, (0, 255, 0), -1)
Рисование эллипса
Эллипс задается центром, осями, углами и направлением:
1
2
3
4
5
6
# Рисование серого залитого эллипса
# Центр: (99, 99), оси: (40, 20)
# Угол поворота: 0°, начальный угол: 0°, конечный угол: 360°
# Цвет: (128, 128, 128) - серый
# Толщина: -1 (заливка)
cv2.ellipse(image, (99, 99), (40, 20), 0, 0, 360, (128, 128, 128), -1)
Рисование многоугольника
Многоугольник создается из массива точек:
1
2
3
4
5
6
7
8
9
10
# Создание массива точек для многоугольника
points = np.array([[100, 5], [125, 30], [175, 20], [185, 10]], np.int32)
# Преобразование формы массива для OpenCV
points = points.reshape((-1, 1, 2))
# Рисование голубого замкнутого многоугольника
# True - замкнутая фигура
# Цвет: (255, 255, 0) - голубой
cv2.polylines(image, [points], True, (255, 255, 0))
Добавление текста
Функция cv2.putText() добавляет текст на изображение:
1
2
3
4
5
# Добавление розового текста
# Позиция: (80, 180) - нижний левый угол текста
# Шрифт: FONT_HERSHEY_DUPLEX, масштаб: 1
# Цвет: (255, 0, 255) - розовый
cv2.putText(image, 'Test', (80, 180), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 0, 255))
Полный пример программы
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2
import numpy as np
# Создание черного изображения
image = np.zeros((200, 200, 3), np.uint8)
# Рисование геометрических фигур
cv2.line(image, (0, 199), (199, 0), (0, 0, 255), 2)
cv2.rectangle(image, (20, 20), (60, 60), (255, 0, 0), 1)
cv2.circle(image, (80, 80), 10, (0, 255, 0), -1)
cv2.ellipse(image, (99, 99), (40, 20), 0, 0, 360, (128, 128, 128), -1)
points = np.array([[100, 5], [125, 30], [175, 20], [185, 10]], np.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(image, [points], True, (255, 255, 0))
cv2.putText(image, 'Test', (80, 180), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 0, 255))
# Отображение результата
cv2.imshow('Geometric Shapes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Дополнительные возможности
Доступные шрифты OpenCV:
cv2.FONT_HERSHEY_SIMPLEX- обычный шрифтcv2.FONT_HERSHEY_PLAIN- маленький шрифтcv2.FONT_HERSHEY_DUPLEX- двойной шрифтcv2.FONT_HERSHEY_COMPLEX- сложный шрифтcv2.FONT_HERSHEY_TRIPLEX- тройной шрифтcv2.FONT_HERSHEY_COMPLEX_SMALL- маленький сложный шрифтcv2.FONT_HERSHEY_SCRIPT_SIMPLEX- рукописный шрифтcv2.FONT_HERSHEY_SCRIPT_COMPLEX- сложный рукописный шрифт
Типы линий:
cv2.LINE_4- 4-связная линияcv2.LINE_8- 8-связная линия (по умолчанию)cv2.LINE_AA- сглаженная линия (антиалиасинг)
Практический пример с настройками
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2
import numpy as np
# Создание белого изображения
image = np.ones((300, 400, 3), np.uint8) * 255
# Рисование с разными типами линий и настройками
cv2.rectangle(image, (50, 50), (150, 150), (0, 0, 255), 2, cv2.LINE_AA)
cv2.circle(image, (200, 100), 30, (0, 255, 0), -1, cv2.LINE_4)
cv2.ellipse(image, (300, 100), (40, 30), 45, 0, 270, (255, 0, 0), 2, cv2.LINE_AA)
# Текст с разными шрифтами
cv2.putText(image, 'OpenCV', (50, 200), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 0), 2)
cv2.putText(image, 'Python', (50, 250), cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 0, 0), 2)
cv2.imshow('Advanced Drawing', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Типичные проблемы и решения
Проблема: Фигуры не отображаются на изображении Решение: Убедитесь, что координаты находятся в пределах размеров изображения
Проблема: Низкое качество линий с изломами
Решение: Используйте cv2.LINE_AA для сглаженных линий, особенно для кругов и эллипсов
Проблема: Текст отображается слишком мелко
Решение: Увеличьте параметр масштаба в cv2.putText() и используйте более крупные шрифты
Проблема: Перекрытие фигур Решение: Помните, что последняя нарисованная фигура будет поверх предыдущих
Освоение функций рисования OpenCV является важным навыком для работы с компьютерным зрением. Эти инструменты позволяют создавать аннотации, визуализировать результаты алгоритмов и разрабатывать интерфейсы для приложений обработки изображений. Правильное использование параметров толщины, типов линий и цветовых пространств обеспечивает высокое качество визуализации.
