如何使用python opencv2在Windows中的图像上写文本


75

我想在图像上放一些文字。我将代码编写为:

cv2.putText(image,"Hello World!!!", (x,y), cv2.CV_FONT_HERSHEY_SIMPLEX, 2, 255)

它给出错误,说“模块”对象没有属性“ CV_FONT_HERSHEY_SIMPLEX”

查询 我不能使用上述字体类型吗?我在Internet上搜索,但只找到了与initFont与Opencv C ++有关的语法。然后我想到了使用putText传递字体类型作为参数。但这对我不起作用。

有什么建议?

Answers:


119

此代码使用cv2.putText在图像上覆盖文本。您需要安装NumPy和OpenCV。

import numpy as np
import cv2

# Create a black image
img = np.zeros((512,512,3), np.uint8)

# Write some Text

font                   = cv2.FONT_HERSHEY_SIMPLEX
bottomLeftCornerOfText = (10,500)
fontScale              = 1
fontColor              = (255,255,255)
lineType               = 2

cv2.putText(img,'Hello World!', 
    bottomLeftCornerOfText, 
    font, 
    fontScale,
    fontColor,
    lineType)

#Display the image
cv2.imshow("img",img)

#Save image
cv2.imwrite("out.jpg", img)

cv2.waitKey(0)

18
这可能是有用知道的书面文本的大小:text_width, text_height = cv2.getTextSize(text_description, font, fontScale, lineType)[0]
若昂Cartucho

3
lineType应该是lineThickness因为这是参数列表。参见:docs.opencv.org/2.4/modules/core/doc/…–
艾伦·图灵

32

CV_FONT_HERSHEY_SIMPLEX在CV(1)?这是我可用于cv2“ FONT”的所有内容:

FONT_HERSHEY_COMPLEX
FONT_HERSHEY_COMPLEX_SMALL
FONT_HERSHEY_DUPLEX
FONT_HERSHEY_PLAIN
FONT_HERSHEY_SCRIPT_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_HERSHEY_SIMPLEX
FONT_HERSHEY_TRIPLEX
FONT_ITALIC

删除“ CV_”似乎对我有用。

cv2.putText(image,"Hello World!!!", (x,y), cv2.FONT_HERSHEY_SIMPLEX, 2, 255)

2
您如何获得可用字体的列表?
Craig S. Anderson

3
@ CraigS.Anderson我的处理方法通常是在Python提示符下,例如:import cv2; [x for x in dir(cv2) if x.startswith('FONT_')]
Peter Hansen

10

这确实是一个令人讨厌的问题。对于python 2.xx,您可以使用:

cv2.CV_FONT_HERSHEY_SIMPLEX

对于Python 3.xx:

cv2.FONT_HERSHEY_SIMPLEX

我建议使用自动完成环境(例如pyscripter或scipy)。如果您查找示例代码,请确保它们使用相同版本的Python(如果不确保您更改了代码)。


10

我有一个类似的问题。PIL与OpenCV中的有限字体相比,我建议在python中使用该库,因为它以任何给定的字体绘制文本。使用PIL,您可以选择系统上安装的任何字体。

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

image = cv2.imread("lena.png")

# Convert to PIL Image
cv2_im_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pil_im = Image.fromarray(cv2_im_rgb)

draw = ImageDraw.Draw(pil_im)

# Choose a font
font = ImageFont.truetype("Roboto-Regular.ttf", 50)

# Draw the text
draw.text((0, 0), "Your Text Here", font=font)

# Save the image
cv2_im_processed = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)
cv2.imwrite("result.png", cv2_im_processed)

result.png


1
尽管您的解决方案显然有效,但我认为它无法回答使用Opencv的问题。
约瑟夫·布丁

4

我知道这是一个非常老的问题,但是我想我有一个解决方案。在openCV的较新版本中,此类数字代表着

    FONT_HERSHEY_SIMPLEX = 0,
    FONT_HERSHEY_PLAIN = 1,
    FONT_HERSHEY_DUPLEX = 2,
    FONT_HERSHEY_COMPLEX = 3,
    FONT_HERSHEY_TRIPLEX = 4,
    FONT_HERSHEY_COMPLEX_SMALL = 5,
    FONT_HERSHEY_SCRIPT_SIMPLEX = 6,
    FONT_HERSHEY_SCRIPT_COMPLEX = 7,
    FONT_ITALIC = 16

所以您要做的就是用相应的数字替换字体名称

cv2.putText(image,"Hello World!!!", (x,y), 0, 2, 255)

再次,我知道这是一个老问题,但将来可能会对某人有所帮助


1

这是带有参数标签的代码

def draw_text(self, frame, text, x, y, color=BGR_COMMON['green'], thickness=1.3, size=0.3,):
    if x is not None and y is not None:
        cv2.putText(
            frame, text, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, size, color, thickness)

对于字体名称,请在此线程中查看另一个答案。

摘录自@Roeffus

这确实是一个令人讨厌的问题。对于python 2.xx,您可以使用:

cv2.CV_FONT_HERSHEY_SIMPLEX和对于Python 3.xx:

cv2.FONT_HERSHEY_SIMPLEX

有关更多信息,请参见http://www.programcreek.com/python/example/83399/cv2.putText


您可以使用库PILasOPENCV github.com/bunkahle/PILasOPENCV,该库是常见PIL函数的包装,但内部仅使用OPENCV
bunkus

1

您可以在当前的opencv版本中使用cv2.FONT_HERSHEY_SIMPLEX代替cv2.CV_FONT_HERSHEY_SIMPLEX


-1

对于上面的示例,解决方案如下所示:

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

image = cv2.imread("lena.jpg")

# Convert to PIL Image
cv2_im_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pil_im = Image.fromarray(cv2_im_rgb)

draw = ImageDraw.Draw(pil_im)

# Choose a font
font = ImageFont.truetype("Roboto-Regular.ttf", 40)

# Draw the text
draw.text((0, 0), "Your Text Here", font=font)

# Save the image
cv2_im_processed = pil_im.getim()
cv2.imshow("cv2_im_processed", cv2_im_processed)
cv2.waitKey()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.