Python 如何使用opencv将单空间字体插入图像?

Python 如何使用opencv将单空间字体插入图像?,python,opencv,text,ocr,monospace,Python,Opencv,Text,Ocr,Monospace,目前,我能够使用openCV API(putText)将好时字体的一些文本插入到图像中。但openCV似乎不支持任何单空间字体 我想知道如何在图像中插入一些单空格或固定音高的文本 在这方面,你可以很容易地使用PIL/枕头。OpenCV图像是numpy数组,因此您可以使用以下方法从OpenCV图像制作枕头图像: PilImage = Image.fromarray(OpenCVimage) OpenCVimage = np.array(PilImage) 然后你可以用我答案中的代码用单间距字体

目前,我能够使用openCV API(putText)将好时字体的一些文本插入到图像中。但openCV似乎不支持任何单空间字体


我想知道如何在图像中插入一些单空格或固定音高的文本

在这方面,你可以很容易地使用PIL/枕头。OpenCV图像是
numpy
数组,因此您可以使用以下方法从OpenCV图像制作枕头图像:

PilImage = Image.fromarray(OpenCVimage)
OpenCVimage = np.array(PilImage)
然后你可以用我答案中的代码用单间距字体画图。您只需要注释“获取图形上下文”后的3行

然后,您可以使用以下方法将其转换回OpenCV图像:

PilImage = Image.fromarray(OpenCVimage)
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)


或者,你可以让一个函数自己生成一块画布,在上面写下你的文本,然后把它拼接到你想要的任何地方。这方面的一些东西-虽然我不知道您需要什么样的灵活性,所以我没有将所有内容参数化:

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


关键词:OpenCV、Python、Numpy、PIL、枕头、图像、图像处理、单空间、字体、字体、固定、固定宽度、courier、HERSHEY。

我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢由于第一个示例没有将OpenCV的BGR转换为RGB,因此将例如
'blue'
传递到
draw.text()
将绘制红色文本。此外,字体位置似乎与操作系统非常相关;在Ubuntu 16.04上,
/usr/share/fonts/truetype/freefont/FreeMono.ttf
对我有用。@UlrichStern是的,没错。我展示的是一个概念,而不是一个经过全面测试、通用化、可投入生产的项目。通常情况下,OPs并没有给出他们需求的完整说明,一些关于如何开始的线索就足够了。@UlrichStern我想你可以将颜色作为一个元组中的BGR三元组传递,然后将其反转……我很感激你的回答,并投了赞成票。然而,由于monospace对操作系统的依赖性,我最终通过测量文本宽度,在基于OvenCV的
putText()
实用程序函数中添加了“列支持”。