Load TrueType Font to OpenCV

后端 未结 3 1217
长情又很酷
长情又很酷 2020-12-05 11:35

Can we load a custom TrueType font and use it with cv2.putText function ?

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,\'OpenCV\',(10,500), f         


        
3条回答
  •  -上瘾入骨i
    2020-12-05 12:02

    In OpenCV, only a subset of Hershey fonts are supported.

    In opencv2/core.hpp, you can find this enum HersheyFonts.

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

    You can try PIL.ImageFont if you want to use custom font.

    A basic example is presented here:

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

提交回复
热议问题