我正在使用cv2.putText()在图像上绘制文本字符串。
当我写:
cv2.putText(img, "This is \n some text", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1, 2)
图像上绘制的文字是:
This is ? some text
我原本期望在新行中打印文字,因为\n
是换行符的转义字符,但它会在图片上绘制?
。
为什么会这样?难道我做错了什么 ?
答案 0 :(得分:27)
不幸的是putText
无法正确处理\n
个符号。请参阅relevant rejected pull request。您需要自己拆分文本并进行多次putText
调用,例如:
text = "This is \n some text"
y0, dy = 50, 4
for i, line in enumerate(text.split('\n')):
y = y0 + i*dy
cv2.putText(img, line, (50, y ), cv2.FONT_HERSHEY_SIMPLEX, 1, 2)
答案 1 :(得分:1)
如果要将多行数据添加到视频的帧中,则必须添加多行putText(),即使上述带有for循环的答案也行不通。
您可以做的是利用python中的“ exec”函数,它将字符串作为输入并将其呈现为代码。
因此,我建议通过使用for循环附加所有行来创建一个小的python代码段作为字符串,并在所需的位置执行它,它也会显示在不同的位置。这种情况对我来说可以为视频添加数据。
stringexec = ""
m=0
for i in TextList:
stringexec = steval+"cv2.putText(frame, TextList[" + str(TextList.index(i))+"], (100, 100+"+str(m)+"), cv2.FONT_HERSHEY_COMPLEX, 0.5, (200, 100, 100), 1, cv2.LINE_AA)\n"
m += 100
exec(stringexec)
答案 2 :(得分:0)
这是另一个例子:
https://gist.github.com/EricCousineau-TRI/596f04c83da9b82d0389d3ea1d782592
基本上,与elyase的答案相同,但也使用getTextSize()
(尽管我不得不将行大小增加一些,超出预期)。
答案 3 :(得分:0)
elyase 提出的方法在 OpenCV 4.5.1.38 中对我很有效。我确实验证了文本字符串仍然可以用“+”连接,并且可以使用“str(value)”插入数值。换行符的开头只是以“\n”开头,一切都按预期运行。
y0, dy, text = 185,50, "FPS: "+str(framerate)+"\nMIN: "+str(frMIN)+"\nMAX: "+str(frMAX)+"\nAVG: "+str(frAVG)
for i, line in enumerate(text.split('\n')):
y = y0 + i*dy
cv2.putText(currStack, line, (50, y ), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA, False)