Пост

Рисование геометрических фигур с помощью 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()

Геометрические фигуры нарисованные OpenCV

Типичные проблемы и решения

Проблема: Фигуры не отображаются на изображении Решение: Убедитесь, что координаты находятся в пределах размеров изображения

Проблема: Низкое качество линий с изломами Решение: Используйте cv2.LINE_AA для сглаженных линий, особенно для кругов и эллипсов

Проблема: Текст отображается слишком мелко Решение: Увеличьте параметр масштаба в cv2.putText() и используйте более крупные шрифты

Проблема: Перекрытие фигур Решение: Помните, что последняя нарисованная фигура будет поверх предыдущих

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

Авторский пост защищен лицензией CC BY 4.0 .

© evdokimoff. Некоторые права защищены.

Использует тему Chirpy для Jekyll