简体   繁体   English

如何使用 Python OpenCV 在 cv2.putText 中制作黑色背景

[英]How to make black background in cv2.putText with Python OpenCV

I have a project of opencv where on the frame I am displaying some text using cv2.putText() .我有一个opencv项目,我在框架上使用cv2.putText()显示一些文本。 Currently it looks like below:目前它看起来如下:

在此处输入图片说明

As you can see on the top left corner, the text is present but its not clearly visible.正如您在左上角看到的那样,文本存在但不清晰可见。 Is it possible to make background black so that the text will then appear good.是否可以将背景设为黑色,以便文本看起来不错。 Something like below image:类似于下图:

在此处输入图片说明

Even if the black background covers till right side of the frame, that is also fine.即使黑色背景覆盖到框架的右侧,也可以。 Below is the code I am using for putting text on frame:下面是我用来在框架上放置文本的代码:

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)

Is there any prebuilt method/library available in opencv which can do this. opencv 中是否有任何可以执行此操作的预构建方法/库。 Can anyone please suggest a good way?任何人都可以请提出一个好方法吗?

There's no prebuilt method but a simple appraoch is to use cv2.rectangle + cv2.putText .没有预先构建的方法,但一个简单的方法是使用cv2.rectangle + cv2.putText All you need to do is to draw the black rectangle on the image followed by placing the text.您需要做的就是在图像上绘制黑色矩形,然后放置文本。 You can adjust the x,y,w,h parameters depending on how large/small you want the rectangle.您可以根据您想要矩形的大小来调整x,y,w,h参数。 Here's an example:下面是一个例子:

Input image:输入图像:

在此处输入图片说明

Result:结果:

在此处输入图片说明

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

Use this function:使用这个功能:

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

Then you can invoke the function like this:然后你可以像这样调用函数:

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

在 OpenCV 中绘制带有背景的文本

note that by default it paints a black background, but you can use a different color if you want.请注意,默认情况下它会绘制黑色背景,但您可以根据需要使用其他颜色。

Here is one way to do that in Python OpenCV.这是在 Python OpenCV 中执行此操作的一种方法。

  • Read the input读取输入
  • Create an image of your desired background color that is the same size as the input创建与输入大小相同的所需背景颜色的图像
  • Draw your text on the background image在背景图像上绘制文本
  • Get the bounding rectangle for the text region获取文本区域的边界矩形
  • Copy the text region from the background color image to a copy of the input image将文本区域从背景颜色图像复制到输入图像的副本
  • Save the results保存结果

Input:输入:

在此处输入图片说明

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


Text on background color image:背景颜色图像上的文字:

在此处输入图片说明

Text on input image:输入图像上的文本:

在此处输入图片说明

PS You can adjust the bounding rectangle (x,y,w,h) values to add some padding if you want when you do the crop. PS 您可以在裁剪时调整边界矩形 (x,y,w,h) 值以添加一些填充。

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)

` `

input输入在此处输入图片说明

output输出在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM