¿Cómo puedo insertar fonts Monospace en una imagen con opencv?

Actualmente, puedo insertar algunos textos de fuente HERSHEY en imágenes con API openCV (putText). Pero parece que openCV no soporta ninguna fuente monoespaciada.

Me preguntaba cómo puedo insertar algunos textos de Monospace o de paso fijo en la imagen.

Podrías usar PIL / Almohada para ese aspecto con bastante facilidad. Las imágenes de OpenCV son matrices numpy , por lo que puedes hacer una imagen de almohada a partir de una imagen de OpenCV con:

 PilImage = Image.fromarray(OpenCVimage) 

Luego puedes dibujar con una fuente mono espaciada usando el código en mi respuesta aquí . Solo necesita las 3 líneas después del comentario “Obtener un contexto de dibujo” .

Luego puedes volver a convertir la imagen de OpenCV con:

 OpenCVimage = np.array(PilImage) 

Eso podría verse así:

 #!/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) 

introduzca la descripción de la imagen aquí


Alternativamente, puede hacer que una función genere un trozo de canvas en sí mismo, escriba su texto en él y luego lo empalme en su imagen OpenCV donde lo desee. Algo parecido a esto, aunque no tengo idea de qué flexibilidad requeriría, así que no lo he parametrizado todo:

 #!/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) 

introduzca la descripción de la imagen aquí

Palabras clave : OpenCV, Python, Numpy, PIL, Pillow, imagen, procesamiento de imágenes, monoespacio, fuente, fonts, fijo, ancho fijo, mensajería, HERSHEY.