【问题标题】:Set width of text using OpenCV (putText)使用 OpenCV (putText) 设置文本宽度
【发布时间】:2020-05-21 05:19:32
【问题描述】:

我正在使用 openCV 编辑视频文件的某些帧。
我正在使用 putText 在框架中插入文本
我卡在文本宽度超过框架宽度的位置
我已经搜索过,但在这个平台上找不到任何合适的解决方案

我的代码如下:

while(cap.isOpened()):

      ret, frame = cap.read()
      if ret==True:

            x = 0
            y = 478
            w = 640
            h = 40

            font = cv2.FONT_HERSHEY_COMPLEX_SMALL
            font_color = (255, 255, 255)
            thick = 1
            text = "A very long text here blaaah blaaah blaaah blaaah blaaah blaaah . . . . . "
            font_size = 0.9
            (text_width, text_height) = cv2.getTextSize(text, font, font_size, thick)[0]

            if text_width > w :
                    # statements to fit width

            loc_x = x + int(w/2) - int(text_width/2)
            loc_y = y + int(h/2) + int(text_height/2)
            frame = cv2.putText(frame,text,(loc_x,loc_y),font,font_size,font_color,thick,cv2.LINE_AA)
            cv2.imwrite("frame.png",frame)

例如,


此外,我不希望文本在下一行下降,我希望文本在宽度超过时应缩小以适合框架
我想减小 WIDTH 而不是 HEIGHT

【问题讨论】:

  • 看到这个答案stackoverflow.com/a/56660627/9681220也许对你有帮助
  • @taherfattahi 似乎textwrap 会尝试适合页面,但它可能会将我的文本带到我不想要的下一行,顺便说一句,我还没有尝试过.

标签: python opencv opencv-python


【解决方案1】:

您可以创建一个与文本高度和宽度大小相同的空白 NumPy 数组(我必须将 15 添加到文本高度,否则文本无法正常显示)并将您的文本放在上面。

import cv2
import numpy as np

img = cv2.imread('messi.jpg')
font = cv2.FONT_HERSHEY_COMPLEX_SMALL
font_color = (255, 255, 255)
thick = 1
text = "A very long text here blaaah blaaah blaaah blaaah blaaah blaaah . . . . . "
font_size = 0.9
(text_width, text_height) = cv2.getTextSize(text, font, font_size, thick)[0]
text_height += 15

mask = np.zeros((text_height, text_width), dtype=np.uint8)
mask = cv2.putText(mask,text,(0,15),font,font_size,font_color,thick,cv2.LINE_AA)

现在将此遮罩的宽度调整为您的图像宽度。

mask = cv2.resize(mask, (img.shape[1], text_height))

此文本需要放在您的原始图像上,这可以通过按位或完成,但在此之前,我们需要使蒙版具有 3 个通道,因为尺寸应该匹配。使用cv2.merge 完成此任务。

mask = cv2.merge((mask, mask, mask))
img[-text_height:, :, :] = cv2.bitwise_or(img[-text_height:, :, :], mask)

您可以随意调整它,只需注意尺寸匹配即可。

【讨论】:

  • 很抱歉这么晚才回复你,实际上你的代码真的很有帮助,问题是我还在弄清楚它是如何工作的。尤其是最后一行img[-text_height:, :, :] = cv2.bitwise_or(img[-text_height:, :, :], mask)。我是 OpenCV 新手
  • 还有哥们,你能告诉我你为什么用text_height += 15吗?我有不同字体的各种文本示例,所以我想办法为所有字体创建一个通用函数
  • 按位或将为两个参数一一获取所有像素并选择最大值。就像您知道逻辑或工作原理一样。与原始图像相比,蒙版的高度较小。所以我们不能直接应用按位或遮罩和图像,因为尺寸应该匹配。所以我们只取所需的图像部分。本质上,高度应该等于文本高度,因此我们使用 numpy 索引抓取我们想要放置文本的区域,并按位或仅应用于原始图像的那部分以及放置文本的掩码。
  • text_height += 15 这样做是因为当我将文本放置在未执行此操作而创建的蒙版上时,文本超出了范围。所以这只是为了确保整个文本保持在界限内。只要您不更改字体大小,这无关紧要。我任意取了 15 次,它奏效了。
  • 这个问题有一个回旋处。在制作蒙版时,使其高度为 50,因此可以轻松放置任何大小的文本。把你所有的文字写在中间。现在删除文本上方和下方的空行。这将消除添加任意数字(如 15)的要求,并且适用于所有字体大小。如果您无法编写代码,请告诉我,我会编写并添加它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2019-12-30
  • 2012-10-26
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
相关资源
最近更新 更多