使用Opencv-Python在图像上绘制指定像素大小的文本

3
在OpenCV Python中,我们使用fontscale或thickness来显示字体大小,但是如果我想让我的字体大小恰好为20px,我该如何做?我应该怎样更改比例/厚度才能计算出所需的点大小?
cv2.putText(img_inpainted,boxes['text'][i],(x,y),cv2.FONT_HERSHEY_PLAIN,1,(120,145,152),1,2)

我希望文本的大小恰好为 L 像素。我该如何实现呢?

我搜索并思考了很多,但找不到任何方法。


将宽度或高度设为20像素,你是什么意思?“L”是什么意思? - alibustami
L是一个任意的像素长度,在这个长度上我可以使用一些公式。 - Arnav
除了putText之外,还有一个函数可以在不绘制文本的情况下给出文本大小。这将帮助您找到特定字体的比例因子。 - Christoph Rackwitz
是的,我知道,类似于getFontSize?但是我该如何使用比例因子以像素为单位获得结果? - Arnav
1
我在 https://stackoverflow.com/questions/73084045/how-to-replace-cropped-rectangle-in-opencv/73084935#73084935 中使用了 cv2.getTextSize()。那个例子对你有帮助吗? - fmw42
显示剩余2条评论
1个回答

3

有一种绕路方式。首先,您需要知道给定任意fontScale的文本大小。然后,假设Hershey向量字体线性缩放,您可以将所需像素高度计算为相应的fontScale

存在函数cv.getTextSize()可为您获取不太完全的某个给定文本的包含盒子的大小。它会给出一个包括上升部分但排除下降部分的框...并且基线比常规字母表中的任何下降线都要低。我猜他们以原点高度渲染文本的实际基线,而额外的baseline值告诉我们绘制文本仍然可以向下延伸多少。

这里是一个简略的概述,因为现在我不会探讨thickness参数的影响,除了假设它为1。

# calculating a factor here
fontScale = 100
fontFace = cv.FONT_HERSHEY_PLAIN

((fw,fh), baseline) = cv.getTextSize(
    "", fontFace=fontFace, fontScale=fontScale, thickness=1) # empty string is good enough
factor = (fh-1) / fontScale

# using the factor now
text = "Hello, World!"
thickness = 1
height_in_pixels = 30 # or 20, code works either way
fontScale = (height_in_pixels - thickness) / factor
(w,h) = (500, 100)
canvas = np.zeros((h, w), 'uint8')
# I'm gonna center it
((fw, fh), baseline) = cv.getTextSize(
    text=text, fontFace=fontFace, fontScale=fontScale, thickness=thickness)
org = ((w-fw)//2, (h+fh)//2)
cv.putText(
    img=canvas, text=text, org=org,
    fontFace=fontFace, fontScale=fontScale, color=255, thickness=thickness)

that ought to be 30 pixels

cv.rectangle(canvas, org, (org[0] + fw, org[1] - fh), 128)
cv.line(canvas, (org[0], org[1]+baseline), (org[0] + fw, org[1]+baseline), 128)

same with "bounding box" and baseline


如果我想要我的字体大小恰好为20像素,我该怎么做? - toyota Supra
是的,我选择了30个像素,这样图片看起来不会太小。我相信OP能够调整这个值。你有什么意见吗? - Christoph Rackwitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接