有一种绕路方式。首先,您需要知道给定任意fontScale
的文本大小。然后,假设Hershey向量字体线性缩放,您可以将所需像素高度计算为相应的fontScale
。
存在函数cv.getTextSize()
可为您获取不太完全的某个给定文本的包含盒子的大小。它会给出一个包括上升部分但排除下降部分的框...并且基线比常规字母表中的任何下降线都要低。我猜他们以原点高度渲染文本的实际基线,而额外的baseline
值告诉我们绘制文本仍然可以向下延伸多少。
这里是一个简略的概述,因为现在我不会探讨thickness
参数的影响,除了假设它为1。
fontScale = 100
fontFace = cv.FONT_HERSHEY_PLAIN
((fw,fh), baseline) = cv.getTextSize(
"", fontFace=fontFace, fontScale=fontScale, thickness=1)
factor = (fh-1) / fontScale
text = "Hello, World!"
thickness = 1
height_in_pixels = 30
fontScale = (height_in_pixels - thickness) / factor
(w,h) = (500, 100)
canvas = np.zeros((h, w), 'uint8')
((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](https://istack.dev59.com/JLTxh.webp)
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](https://istack.dev59.com/onlvm.webp)