python 将TrueType字体加载到OpenCV

klh5stk1  于 2023-11-15  发布在  Python
关注(0)|答案(4)|浏览(137)

我们可以加载一个自定义的TrueType字体并将其与cv2.putText函数一起使用吗?

  1. font = cv2.FONT_HERSHEY_SIMPLEX
  2. cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)

字符串

pes8fvy9

pes8fvy91#

在OpenCV中,仅支持Hershey字体的一个子集。
opencv2/core.hpp中,您可以找到此枚举HersheyFonts。

  1. //! Only a subset of Hershey fonts
  2. enum HersheyFonts {
  3. FONT_HERSHEY_SIMPLEX = 0, //!< normal size sans-serif font
  4. FONT_HERSHEY_PLAIN = 1, //!< small size sans-serif font
  5. FONT_HERSHEY_DUPLEX = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
  6. FONT_HERSHEY_COMPLEX = 3, //!< normal size serif font
  7. FONT_HERSHEY_TRIPLEX = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
  8. FONT_HERSHEY_COMPLEX_SMALL = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
  9. FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
  10. FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
  11. FONT_ITALIC = 16 //!< flag for italic font
  12. };

字符串
如果你想使用自定义字体,你可以试试PIL.ImageFont。
下面是一个基本的例子:

  1. import numpy as np
  2. from PIL import ImageFont, ImageDraw, Image
  3. import cv2
  4. import time
  5. ## Make canvas and set the color
  6. img = np.zeros((200,400,3),np.uint8)
  7. b,g,r,a = 0,255,0,0
  8. ## Use cv2.FONT_HERSHEY_XXX to write English.
  9. text = time.strftime("%Y/%m/%d %H:%M:%S %Z", time.localtime())
  10. cv2.putText(img, text, (50,50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (b,g,r), 1, cv2.LINE_AA)
  11. ## Use simsum.ttc to write Chinese.
  12. fontpath = "./simsun.ttc"
  13. font = ImageFont.truetype(fontpath, 32)
  14. img_pil = Image.fromarray(img)
  15. draw = ImageDraw.Draw(img_pil)
  16. draw.text((50, 100), "国庆节/中秋节 快乐!", font = font, fill = (b, g, r, a))
  17. img = np.array(img_pil)
  18. ## Display
  19. cv2.imshow("res", img);cv2.waitKey();cv2.destroyAllWindows()
  20. cv2.imwrite("res.png", img)


的数据

展开查看全部
30byixjq

30byixjq2#

对于新的查看器,OpenCV通过FreeType2类支持自定义字体,自OpenCV 3.0.0起。

kcrjzv8t

kcrjzv8t3#

x1c 0d1x的数据
你也可以使用pilasOPENCV库,在https://github.com/bunkahle/PILasOPENCV中找到,将truetype字体与Python OpenCV结合使用。不需要PIL或Pillow。该模块依赖于freetype-py库。字体将像这样导入:

  1. from __future__ import print_function
  2. import PILasOPENCV as Image
  3. import PILasOPENCV as ImageDraw
  4. import PILasOPENCV as ImageFont
  5. import cv2
  6. # was: from PIL import Image, ImageDraw, ImageFont
  7. font = ImageFont.truetype("arial.ttf", 18)
  8. print(font)
  9. im = Image.open("lena.jpg")
  10. draw = ImageDraw.Draw(im)
  11. text = "Lena's image"
  12. draw.text((249,455), text, font=font, fill=(0, 0, 0))
  13. # in PIL:
  14. # print(font.getsize(text))
  15. # mask = font.getmask(text)
  16. print(ImageFont.getsize(text, font))
  17. mask = ImageFont.getmask(text, font)
  18. print(type(mask))
  19. cv2.imshow("mask", mask)
  20. im.show()

字符串
这个库是围绕常用PIL函数的 Package 器,但在内部与OpenCV一起工作。

展开查看全部
ipakzgxi

ipakzgxi4#

为了补充@Pavlos Fragkiadoulakis的答案:这里有一个使用OpenCV 4.8.0在Python中创建带有文本和自定义字体的空二进制图像的示例。

  1. import cv2 as cv
  2. import numpy as np
  3. text = str(-1.234)
  4. font_height = 400
  5. thickness = 1
  6. # load font and check text size
  7. ft = cv.freetype.createFreeType2()
  8. ft.loadFontData("Seven Segment.ttf", 0)
  9. width, height = ft.getTextSize(text, font_height, thickness)[0]
  10. # create empty white image (slightly bigger than text size)
  11. binary_image = np.ones((int(1.05*height), int(1.05*width)), dtype=np.uint8) * 255
  12. # adjust text positioning
  13. text_origin = (0, height+5)
  14. # add text to image
  15. ft.putText(binary_image, text, text_origin, font_height, (0, 0, 0), thickness, cv.LINE_8, True)
  16. # display image
  17. cv.imshow("", binary_image)
  18. cv.waitKey()

字符串

展开查看全部

相关问题