На предыдущем уроке мы научились получать поток кадров с веб-камеры и применять к ним различные преобразования. Сегодня рассмотрим еще несколько полезных функций, которые помогут нам выводить в кадр важную информацию.
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()
Запускаем программу. Должно получиться что-то подобное:
На следующем уроке будем изучать работу с цветовыми фильтрами — основу для многих функций детектирования.
Ошибка
Traceback (most recent call last):
File «C:\Users\emose\OneDrive\Рабочий стол\sdfasd — копия — копия.py», line 1, in
import cv2
ModuleNotFoundError: No module named ‘cv2’
А библиотека OpenCV у вас установлена?
а как русский текст вывести ?? выводит типа ????? ??????
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()
пишет, что нет модуля video