Python 使用OpenCV(putText)设置文本宽度

Python 使用OpenCV(putText)设置文本宽度,python,opencv,opencv-python,Python,Opencv,Opencv Python,我正在使用openCV编辑视频文件的一些帧。 我正在使用putText在框架中插入文本 我被困在文本宽度超过框架宽度的地方 我已经搜索过了,但是在这个平台上还没有找到合适的解决方案 我的代码如下: while(cap.isOpened()): ret, frame = cap.read() if ret==True: x = 0 y = 478 w = 640 h = 40

我正在使用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)

比如说,,


另外,我不想让文本掉到下一行,我希望文本的宽度应该缩小,以便在超过该宽度时可以放入框架中

我想减少宽度,而不是高度,你可以创建一个文本高度和宽度大小的空白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)


您可以在任何地方调整它,只需注意尺寸匹配。

查看此答案可能会有所帮助you@taherfattahi似乎
textwrap
会尝试适应页面,但它可能会将我的文本带到下一行,这是我不想要的,顺便说一下,我还没有尝试过。它是否有用?还有,伙计,您能告诉我为什么要使用
文本高度+=15
??我有各种不同字体的文本样本,所以我想为所有字体创建一个通用函数,或者为两个参数逐个获取所有像素并选择最大值。如果你知道逻辑or是如何工作的。与原始图像相比,遮罩的高度更小。因此,我们不能直接将按位或应用于遮罩和图像,因为尺寸应该匹配。所以我们只取图像中需要的部分。从本质上说,高度应该等于文本高度,因此我们使用numpy索引获取要放置文本的区域,并将按位或仅应用于原始图像的该部分以及用于放置文本的掩码。
text\u height+=15
这是在我将文本放置在创建的掩码上时完成的,而没有这样做,文本就消失了界限。因此,这只是为了确保整个文本保持在一定范围内。只要你不改变字体大小,这就不重要了。我已经采取了15个任意的,它的工作。嗯,有一个迂回的问题。制作遮罩时,将其高度设置为50,以便轻松放置任意大小的文本。把你所有的文字写在中间。现在删除文本上方和下方的空行。这将消除添加任意数字(如15)的要求,并适用于所有字体大小。如果你不能编码它,让我知道我会做它,并添加它。