Как обернуть текст в OpenCV, когда я печатаю его на изображении, и оно превышает рамку изображения? - PullRequest
2 голосов
/ 19 июня 2019

У меня есть изображение с соотношением 1: 1, и я хочу убедиться, что если текст превышает рамку изображения, он переносится на следующую строку.Как бы я это сделал?

Я думаю о создании блока if-else, где «если предложение превышает x символов-> новая строка», но я не уверен, как это реализовать.

import numpy as np
import cv2

img = cv2.imread('images/1.png')
print(img.shape)

height, width, channel = img.shape

text_img = np.ones((height, width))
print(text_img.shape)
font = cv2.FONT_HERSHEY_SIMPLEX
text = "Lorem Ipsum "
textsize = cv2.getTextSize(text, font, 2, 2)[0]

font_size = 1
font_thickness = 2
for i, line in enumerate(text.split('\n')):

    textsize = cv2.getTextSize(line, font, font_size, font_thickness)[0]

    gap = textsize[1] + 10

    y = int((img.shape[0] + textsize[1]) / 2) + i * gap
    x = int((img.shape[1] - textsize[0]) / 2)

    cv2.putText(img, line, (x, y), font,
                font_size, 
                (0,0,0), 
                font_thickness, 
                lineType = cv2.LINE_AA)

cv2.imshow("Result Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1 Ответ

5 голосов
/ 19 июня 2019

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

import numpy as np
import cv2
import textwrap 

img = cv2.imread('apple.png')
print(img.shape)

height, width, channel = img.shape

text_img = np.ones((height, width))
print(text_img.shape)
font = cv2.FONT_HERSHEY_SIMPLEX

text = "Lorem Ipsum dgdhswjkclyhwegflhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhvhasvcxsbvfajhskvfgsdj"
wrapped_text = textwrap.wrap(text, width=35)
x, y = 10, 40
font_size = 1
font_thickness = 2

i = 0
for line in wrapped_text:
    textsize = cv2.getTextSize(line, font, font_size, font_thickness)[0]

    gap = textsize[1] + 10

    y = int((img.shape[0] + textsize[1]) / 2) + i * gap
    x = int((img.shape[1] - textsize[0]) / 2)

    cv2.putText(img, line, (x, y), font,
                font_size, 
                (0,0,0), 
                font_thickness, 
                lineType = cv2.LINE_AA)
    i +=1

cv2.imshow("Result Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Ниже приведено изображение без использования textwrap (запуск кода):

enter image description here

Ниже выводится изображение с использованием textwrap (мой код):

enter image description here

Существует много другихспособы достижения того же, но textwrap, безусловно, является одним из способов сделать это в OpenCV, и он также прост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...