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

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
S Andrew
S Andrew
发布于 2020-03-14
4 个回答
estebanuri
estebanuri
发布于 2020-09-20
已采纳
0 人赞同

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

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

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

注意,默认情况下,它画的是黑色背景,但如果你想,可以使用不同的颜色。

这似乎是一个比所选方案更好的解决方案!
很好的解决方案,但在这一行出现了类型错误:cv2.putText(img, text, (x, y + text_h + font_scale - 1), font, font_scale, text_color, font_thickness)。我不得不将表达式 "y + text_h + font_scale - 1 "转换为int。这一行应该是这样的:cv2.putText(img, text, (x, int(y + text_h + font_scale - 1)), font, font_scale, text_color, font_thickness)
nathancy
nathancy
发布于 2020-09-20
0 人赞同

没有预先建立的方法,但一个简单的评估是使用cv2.rectangle + cv2.putText.你所需要做的就是在图像上画出黑色的矩形,然后再放置文字。你可以根据你想要的矩形的大小来调整x,y,w,h的参数。下面是一个例子。

输入图像。

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()
    
这种方法的问题是,你不知道文本是否会跑到黑色矩形之外,或者文本对黑色矩形来说会不会太小,除非你从字体指标中计算出文本需要的大小。
fmw42
fmw42
发布于 2020-09-20
0 人赞同

下面是在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()
    背景色图像上的文字。

    输入图像上的文本。

    P.S. 你可以调整边界矩形(x,y,w,h)的值,如果你想在裁剪时增加一些填充。

    Bharath Kumar
    Bharath Kumar
    发布于 2020-09-20
    0 人赞同
    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)