Как я могу вставить моноширинные шрифты в изображение с помощью opencv? - PullRequest
0 голосов
/ 09 декабря 2018

В настоящее время я могу вставлять некоторые тексты шрифта HERSHEY в изображения с помощью openCV API (putText).Но кажется, что openCV не поддерживает какой-либо моноширинный шрифт.

Мне было интересно, как я могу вставить моноширинный текст или текст с фиксированным шагом в изображение.

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете использовать PIL / Pillow для этого аспекта довольно легко.Изображения OpenCV представляют собой numpy массивы, поэтому вы можете создать изображение подушки из изображения OpenCV с помощью:

PilImage = Image.fromarray(OpenCVimage)

Затем вы можете рисовать моноширинным шрифтом, используя код в моем ответе здесь .Вам нужно только 3 строки после комментария «Получить контекст рисования» .

Затем вы можете конвертировать обратно в изображение OpenCV с помощью:

OpenCVimage = np.array(PilImage)

Это может выглядетькак это:

#!/usr/local/bin/python3

from PIL import Image, ImageFont, ImageDraw
import numpy as np
import cv2

# Open image with OpenCV
im_o = cv2.imread('start.png')

# Make into PIL Image
im_p = Image.fromarray(im_o)

# Get a drawing context
draw = ImageDraw.Draw(im_p)
monospace = ImageFont.truetype("/Library/Fonts/Andale Mono.ttf",32)
draw.text((40, 80),"Hopefully monospaced",(255,255,255),font=monospace)

# Convert back to OpenCV image and save
result_o = np.array(im_p)
cv2.imwrite('result.png', result_o)

enter image description here


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

#!/usr/local/bin/python3

from PIL import Image, ImageFont, ImageDraw, ImageColor
import numpy as np
import cv2


def GenerateText(size, fontsize, bg, fg, text):
   """Generate a piece of canvas and draw text on it"""
   canvas = Image.new('RGB', size, bg)

   # Get a drawing context
   draw = ImageDraw.Draw(canvas)
   monospace = ImageFont.truetype("/Library/Fonts/Andale Mono.ttf",fontsize)
   draw.text((10, 10), text, fg, font=monospace)

   # Change to BGR order for OpenCV's peculiarities
   return cv2.cvtColor(np.array(canvas), cv2.COLOR_RGB2BGR)


# Open image with OpenCV
im_o = cv2.imread('start.png')


# Try some tests
w,h = 350,50
a,b = 20, 80
text = GenerateText((w,h), 32, 'black', 'magenta', "Magenta on black")
im_o[a:a+h, b:b+w] = text


w,h = 200,40
a,b = 120, 280
text = GenerateText((w,h), 18, 'cyan', 'blue', "Blue on cyan")
im_o[a:a+h, b:b+w] = text

cv2.imwrite('result.png', im_o)

enter image description here

Ключевые слова : OpenCV, Python, Numpy, PIL, Pillow, изображение, обработка изображений, моноширинный шрифт, шрифты, фиксированная, фиксированная ширина, курьер, HERSHEY.

...