【问题标题】:How to write text on a image in windows using python opencv2如何使用 python opencv2 在 Windows 中的图像上写入文本
【发布时间】:2013-05-13 00:18:04
【问题描述】:

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

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

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

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

有什么建议吗?

【问题讨论】:

    标签: python windows opencv


    【解决方案1】:

    我使用 python 3,下面的代码对我来说很好。

    import cv2
    
    image = cv2.imread('lena.jpg',1)
    
    font = cv2.FONT_HERSHEY_COMPLEX
    cv2.putText(image,'Hello There',(0,100),font,2,(255,255,255),3)  #text,coordinate,font,size of text,color,thickness of font
    
    cv2.imshow('image',image)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()
    

    【讨论】:

      【解决方案2】:

      此代码使用 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)
      thickness              = 1
      lineType               = 2
      
      cv2.putText(img,'Hello World!', 
          bottomLeftCornerOfText, 
          font, 
          fontScale,
          fontColor,
          thickness,
          lineType)
      
      #Display the image
      cv2.imshow("img",img)
      
      #Save image
      cv2.imwrite("out.jpg", img)
      
      cv2.waitKey(0)
      

      【讨论】:

      • 了解书面文字的大小可能很有用:text_width, text_height = cv2.getTextSize(text_description, font, fontScale, lineType)[0]
      • 这里的lineType 应该是lineThickness,因为那是参数列表。见:docs.opencv.org/2.4/modules/core/doc/…
      【解决方案3】:

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

      【讨论】:

        【解决方案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)
        

        我再次知道这是一个老问题,但它可能会在未来帮助某人

        【讨论】:

          【解决方案5】:

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

          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()
          

          【讨论】:

            【解决方案6】:

            我遇到了类似的问题。与 OpenCV 中的有限字体相比,我建议在 python 中使用PIL 库,因为它以任何给定字体绘制文本。使用 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)
            

            结果.png

            【讨论】:

            • 虽然您的解决方案显然有效,但我认为它不能回答指定它使用 Opencv 的问题。
            【解决方案7】:

            这是带有参数标签的代码

            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.x.x 你使用:

            cv2.CV_FONT_HERSHEY_SIMPLEX 对于 Python 3.x.x:

            cv2.FONT_HERSHEY_SIMPLEX

            更多信息请看http://www.programcreek.com/python/example/83399/cv2.putText

            【讨论】:

            【解决方案8】:

            这确实是一个有点烦人的问题。 对于 python 2.x.x,您使用:

            cv2.CV_FONT_HERSHEY_SIMPLEX
            

            对于 Python 3.x.x:

            cv2.FONT_HERSHEY_SIMPLEX
            

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

            【讨论】:

              【解决方案9】:

              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)
              

              【讨论】:

              • 您是如何获得可用字体列表的?
              • @CraigS.Anderson 我的方法通常只是在 Python 提示符下,像这样:import cv2; [x for x in dir(cv2) if x.startswith('FONT_')]
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-12-01
              • 1970-01-01
              • 1970-01-01
              • 2016-12-25
              • 2016-10-20
              • 2017-08-10
              相关资源
              最近更新 更多