首页 文章

如何使用opencv将Monospace字体插入图像?

提问于
浏览
0

目前,我可以使用openCV API(putText)将一些HERSHEY字体文本插入到图像中 . 但似乎openCV不支持任何等宽字体 .

我想知道如何在图像中插入一些等宽或固定音高的文本 .

1 回答

  • 1

    您可以非常轻松地使用PIL / Pillow . OpenCV图像是 numpy 数组,因此您可以使用以下命令从OpenCV图像制作枕头图像:

    PilImage = Image.fromarray(OpenCVimage)
    

    然后你可以使用我的答案here中的代码用单声道间隔字体绘制 . 您只需要在评论"Get a drawing context"之后的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)
    

    或者,您可以使用一个函数生成一块画布本身,在其上写下您的文本,然后将其拼接到您想要的任何地方的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)
    

相关问题