cv2.putText русский текст
Добавляю текст на изображение таким образом
cv2.putText(img,'text',(10,round(height/2)), font, 4,(0,0,0),12,cv2.LINE_AA)
Проблема в том, что если написать русские символы, текст превращается в вопросительные знаки. Можно ли как то явно указать кодировку для putText?
Ответы (2 шт):
Автор решения: Arseniy Pavlenko
→ Ссылка
попробуй указать fontFace=cv2.FONT_HERSHEY_COMPLEX, должно как то так выглядеть:
cv2.putText(img,'text',(10,round(height/2)), font, 4,(0,0,0),12,cv2.LINE_AA, fontFace=cv2.FONT_HERSHEY_COMPLEX)
Автор решения: Burunduk 38
→ Ссылка
Работает с обрезанием длинных строк, и с прозрачным или заданным фоном вокруг текста! Прозрачный фон получается при transparency=0, а при transparency=255 полностью белый фон.
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
def add_text_to_image(text, font, colour, background_color=(255, 255, 255), transparency=255):
# Создаем временное изображение для определения размеров текста
text_img = Image.new('RGBA', (1, 1))
draw = ImageDraw.Draw(text_img)
# Получаем размеры изображения текста
text_bbox = draw.textbbox((0, 0), text, font)
# Создаем изображение текста с заданным цветом и фоном
text_img = Image.new('RGBA', (text_bbox[2] - text_bbox[0], text_bbox[3] - text_bbox[1]),
background_color + (transparency,))
draw = ImageDraw.Draw(text_img)
draw.text((-text_bbox[0], -text_bbox[1]), text, font=font, fill=colour)
return np.array(text_img)
def putText(
cv2_img, text, text_position_x, text_position_y,
font_size=36, colour=(255, 255, 255), background_color=(255, 255, 255), transparency=255):
font_path = r'C:\Windows\Fonts\couri.ttf'
font = ImageFont.truetype(font_path, font_size)
text_img = add_text_to_image(text, font, colour, background_color, transparency)
text_height, text_width = text_img.shape[:2]
# Проверка размера текста перед вставкой
if (text_position_y + text_height > cv2_img.shape[0]):
text_img = text_img[:cv2_img.shape[0] - text_position_y, :]
text_height = text_img.shape[0]
if (text_position_x + text_width > cv2_img.shape[1]):
text_img = text_img[:, :(cv2_img.shape[1] - text_position_x)]
text_width = text_img.shape[1]
# Обработка альфа-канала
alpha = text_img[:, :, 3] / 255.0
for c in range(3):
cv2_img[text_position_y:text_position_y + text_height, text_position_x:text_position_x + text_width, c] = \
cv2_img[text_position_y:text_position_y + text_height, text_position_x:text_position_x + text_width, c] * \
(1 - alpha) + text_img[:, :, c] * alpha
def main():
photo = np.zeros((400, 600, 3), dtype=np.uint8)
cv2.line(photo, (100, 100), (600, 100), (101, 44, 158), thickness=3)
cv2.rectangle(photo, (100, 150), (220, 350), (101, 44, 158), thickness=3)
cv2.rectangle(photo, (300, 50), (550, 350), (101, 44, 158), thickness=3)
text = "Маленькое окно"
putText(photo, text, 100, 100, font_size=36, colour=(0, 0, 255), background_color=(255, 255, 255), transparency=100)
cv2.imshow('Окно', photo)
cv2.waitKey()
text = "Длинное Окно до горизонта ......................"
putText(photo, text, 50, 200, font_size=36, colour=(0, 0, 255), background_color=(255, 255, 255), transparency=0)
cv2.imshow('Окно', photo)
cv2.waitKey()
if __name__ == "__main__":
main()