【问题标题】:How to make black background in cv2.putText with Python OpenCV如何使用 Python OpenCV 在 cv2.putText 中制作黑色背景
【发布时间】:2020-06-25 16:59:23
【问题描述】:

我有一个opencv 的项目,在框架上我使用cv2.putText() 显示一些文本。目前看起来如下:

正如您在左上角看到的那样,文本存在但不清晰可见。是否可以将背景设置为黑色,以便文本看起来不错。如下图所示:

即使黑色背景覆盖到框架的右侧,也可以。下面是我用来在框架上放置文本的代码:

cv2.putText(frame, "Data: N/A", (5, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)
cv2.putText(frame, "Room: C1", (5, 60), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)

opencv 中是否有任何预构建的方法/库可以做到这一点。谁能推荐一个好方法?

【问题讨论】:

    标签: python python-3.x image opencv image-processing


    【解决方案1】:

    这是在 Python OpenCV 中执行此操作的一种方法。

    • 读取输入
    • 创建与输入相同大小的所需背景颜色的图像
    • 在背景图片上绘制文字
    • 获取文本区域的边界矩形
    • 将文本区域从背景颜色图像复制到输入图像的副本
    • 保存结果

    输入:

    import cv2
    import numpy as np
    
    # load image
    img = cv2.imread("zelda1.jpg")
    
    # create same size image of background color
    bg_color = (0,0,0)
    bg = np.full((img.shape), bg_color, dtype=np.uint8)
    
    # draw text on bg
    text_color = (0,0,255)
    cv2.putText(bg, "Data: N/A", (5,30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 0.75, text_color, 1)
    
    # get bounding box
    # use channel corresponding to color so that text is white on black background
    x,y,w,h = cv2.boundingRect(bg[:,:,2])
    print(x,y,w,h)
    
    # copy bounding box region from bg to img
    result = img.copy()
    result[y:y+h, x:x+w] = bg[y:y+h, x:x+w]
    
    # write result to disk
    cv2.imwrite("zelda1_background_text.jpg", bg)
    cv2.imwrite("zelda1_text.jpg", result)
    
    # display results
    cv2.imshow("TEXT", bg)
    cv2.imshow("RESULT", result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    


    背景彩色图片上的文字:

    输入图像上的文字:

    附:您可以在裁剪时调整边界矩形 (x,y,w,h) 值以添加一些填充。

    【讨论】:

      【解决方案2】:

      没有预先构建的方法,但一个简单的方法是使用cv2.rectangle + cv2.putText。您需要做的就是在图像上绘制黑色矩形,然后放置文本。您可以根据您想要矩形的大小来调整x,y,w,h 参数。这是一个例子:

      输入图片:

      结果:

      import cv2
      import numpy as np
      
      # Load image, define rectangle bounds
      image = cv2.imread('1.jpg')
      x,y,w,h = 0,0,175,75
      
      # Draw black background rectangle
      cv2.rectangle(image, (x, x), (x + w, y + h), (0,0,0), -1)
      
      # Add text
      cv2.putText(image, "THICC flower", (x + int(w/10),y + int(h/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 2)
      
      # Display
      cv2.imshow('image', image)
      cv2.waitKey()
      

      【讨论】:

      • 这种方法的问题是你不知道文本是否会跑到黑色矩形之外,或者文本对于黑色矩形来说是否太小,除非你计算出文本的大小需要从字体指标。
      【解决方案3】:
      import cv2 \
      import numpy as np
      
      #### Load image, define rectangle bounds
      image = cv2.imread(r'C:\Users\Bharath\Downloads\test.jpg')
      
      #### overlay space
      x,y,w,h = 40,30,300,60
      
      
      #### alpha, the 4th channel of the image
      alpha = 0.3
      
      overlay = image.copy()
      output = image.copy()
      
      
      ##### corner
      cv2.rectangle(overlay, (x, x), (x + w, y + h), (0,0,0), -1)
      
      ##### putText
      cv2.putText(overlay, "HELLO WORLD..!", (x + int(w/10),y + int(h/1.5)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 2)
      
      #### apply the overlay
      cv2.addWeighted(overlay, alpha, output, 1 - alpha,0, output)
      
      
      ##### Display
      cv2.imshow("Output", output)\
      cv2.waitKey(0)
      

      `

      输入

      输出

      【讨论】:

        【解决方案4】:

        使用此功能:

        import cv2
        
        def draw_text(img, text,
                  font=cv2.FONT_HERSHEY_PLAIN,
                  pos=(0, 0),
                  font_scale=3,
                  font_thickness=2,
                  text_color=(0, 255, 0),
                  text_color_bg=(0, 0, 0)
                  ):
        
            x, y = pos
            text_size, _ = cv2.getTextSize(text, font, font_scale, font_thickness)
            text_w, text_h = text_size
            cv2.rectangle(img, pos, (x + text_w, y + text_h), text_color_bg, -1)
            cv2.putText(img, text, (x, y + text_h + font_scale - 1), font, font_scale, text_color, font_thickness)
        
            return text_size
        

        然后你可以像这样调用函数:

        image = 127 * np.ones((100, 200, 3), dtype="uint8")
        pos = (10, 10)
        w, h = draw_text(image, "hello", pos=(10, 10))
        draw_text(image, "world", font_scale=4, pos=(10, 20 + h), text_color_bg=(255, 0, 0))
        cv2.imshow("image", image)
        cv2.waitKey()
        

        请注意,默认情况下它会绘制黑色背景,但您可以根据需要使用不同的颜色。

        【讨论】:

        • 这似乎是比选择的更好的解决方案!
        猜你喜欢
        • 2022-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多