OpenCV на python: наложение текста и графики

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

1. Вывод текста поверх картинки в OpenCV

Для наложения текста на кадр воспользуемся функцией:

putText( кадр, текст, координаты, 
         тип шрифта, масштаб шрифта, 
         цвет [, толщина пера [, тип линии [, центр координат]]])
  • кадр — изображение, на которое мы накладываем текст;
  • текст — понятное дело, текст, который мы собираемся вывести в кадр;
  • координаты — кортеж из двух координат нижнего левого угла текста, например (5,10);
  • тип шрифта — одна из констант, указанных ниже;
  • масштаб шрифта — у шрифта есть некий стандартный размер, который довольно таки большой. Этот параметр позволяет уменьшать или увеличивать шрифт относительно стандартного. Например, для увеличения в два раза — пишем 2, для уменьшения в 2 раза — 0.5;
  • цвет — кортеж из трех чисел от 0 до 255, которые задают цвет в модели RGB. Нужно помнить, что в этом кортеже, цвета идут задом на перед: BGR. Синий цвет — (255,0,0);
  • толщина пера — необязательный параметр;
  • тип линии — необязательный параметр, одно из трех значений: LINE_8 пунктир мелкий, LINE_4 — пунктир крупный, LINE_AA — сглаженная линия;
  • центр координат — необязательный параметр. По-умолчанию координаты текста отсчитываются от верхнего левого угла. Если этот параметр равен True, то будут от нижнего левого угол.

Типы шрифтов:

  • FONT_HERSHEY_SIMPLEX
  • FONT_HERSHEY_PLAIN
  • FONT_HERSHEY_DUPLEX
  • FONT_HERSHEY_COMPLEX
  • FONT_HERSHEY_TRIPLEX
  • FONT_HERSHEY_COMPLEX_SMALL
  • FONT_HERSHEY_SCRIPT_SIMPLEX
  • FONT_HERSHEY_SCRIPT_COMPLEX

Напишем программу, которая выведет в кадр текст «Hello world!» с координатами 20,20, желтым цветом.

import cv2
import video

if __name__ == '__main__':
    cv2.namedWindow( "result" )

cap = video.create_capture(0)

color_yellow = (0,255,255)

while True:
    flag, img = cap.read()
    try:
        cv2.putText(img, "Hello world!", (20,20), cv2.FONT_HERSHEY_SIMPLEX, 1, color_yellow, 2)
        cv2.imshow('result', img)
    except:
        cap.release()
        raise
 
    ch = cv2.waitKey(5)
    if ch == 27:
        break

cap.release()
cv2.destroyAllWindows()

2. Вывод отрезка, окружности и прямоугольника в OpenCV

Перейдем к геометрическим фигурам. Для вывода отрезка используем функцию:

line( кадр, координаты начала, координаты конца, 
      цвет [, толщина пера [, тип линии [, сдвиг]]])

помимо известных уже аргументов есть и один новый:

  • сдвиг — необязательный параметр. Отвечает за смещение координат по формуле x = x*2^-сдвиг. Применяется для создания сглаженных линий.

Следующая функции рисует окружность:

circle( кадр, координаты центра, радиус, 
        цвет [, толщина пера [, тип линии [, сдвиг]]])

Тут всё просто, так что переходим к прямоугольнику:

rectangle( кадр, координаты 1, координаты 2, 
           цвет [, толщина пера [, тип линии [, сдвиг]]])

Здесь:

  • координаты 1 — координаты верхнего левого угла;
  • координаты 2 — координаты нижнего правого угла.

Теперь вставим в нашу программу все три функции.

import cv2
import video

if __name__ == '__main__':
    cv2.namedWindow( "result" )

cap = video.create_capture(0)

color_red = (0,0,255)
color_yellow = (0,255,255)
color_purple = (255,0,255)

while True:
    flag, img = cap.read()
    try:
        # рисуем окружность
        cv2.circle(img, (190, 70), 10, color_red, -1)
        # рисуем прямоугольник
        cv2.rectangle(img, (180,140), (370,180), color_red, thickness=2, lineType=8, shift=0)
        # рисуем пять отрезков
        for i in range(5):
            cv2.line(img, (180,85+i*5), (370,85+i*5), color_purple, thickness=2, lineType=8, shift=0)
        # выводим текст
        cv2.putText(img, "Hello world!", (185,170), cv2.FONT_HERSHEY_SIMPLEX, 1, color_yellow, 2)

        cv2.imshow('result', img)
    except:
        cap.release()
        raise
 
    ch = cv2.waitKey(5)
    if ch == 27:
        break

cap.release()
cv2.destroyAllWindows()

Запускаем программу. Должно получиться что-то подобное:

OpenCV на python. Наложение текста и графики

На следующем уроке будем изучать работу с цветовыми фильтрами — основу для многих функций детектирования.


Изменено:

OpenCV на python: наложение текста и графики: 5 комментариев

  1. Ошибка
    Traceback (most recent call last):
    File «C:\Users\emose\OneDrive\Рабочий стол\sdfasd — копия — копия.py», line 1, in
    import cv2
    ModuleNotFoundError: No module named ‘cv2’

    • putText работает только с acii. Есть два варианта:
      использовать функцию text из библиотеки PIL:
      from PIL import ImageDraw, Image
      fontpath = "./какой-нибудь-русский-шрифт.ttc"
      font = ImageFont.truetype(fontpath, 32)
      img_pil = Image.fromarray(img)
      draw = ImageDraw.Draw(img_pil)
      draw.text((50, 80), "Привет", font = font, fill = (b, g, r, a))
      img = np.array(img_pil)

      Или если opencv собран с поддержкой pyQt:
      cv::addText()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.