OpenCV 的 `getTextSize` 和 `putText` return 错误大小和像素较低的字母
OpenCV's `getTextSize` and `putText` return wrong size and chop letters with lower pixels
我有以下 Python 代码:
FONT = cv2.FONT_HERSHEY_SIMPLEX
FONT_SCALE = 1.0
FONT_THICKNESS = 2
bg_color = (255, 255, 255)
label_color = (0, 0, 0)
label = 'Propaganda'
label_width, label_height = cv2.getTextSize(label, FONT, FONT_SCALE, FONT_THICKNESS)[0]
label_patch = np.zeros((label_height, label_width, 3), np.uint8)
label_patch[:,:] = bg_color
我创建了一个新的空白图像,大小为 return getTextSize
,然后,根据文档,我在左下角添加了文本,即 x = 0, y = (height - 1)
并使用与 getTextSize
相同的字体、比例和粗细参数
cv2.putText(label_patch, label, (0, label_height - 1), FONT, FONT_SCALE, label_color, FONT_THICKNESS)
但是当我在图像 label_patch
上使用 imshow
或 imwrite
时,这是我得到的结果:
很容易看出,小写的p
和小写的g
被中间截断了,以至于g
和a
根本就分不清了。如何使 OpenCV 的 getTextSize
return 大小正确,以及如何使 OpenCV 的 putText
从实际最低点开始绘制文本?
找到解决方案,回答自己并希望其他人能从中受益。
原来还有一个参数是getTextSize
returns,就是那个baseline
。我创建的盒子应该考虑到它:它的高度应该是 label_height + baseline
:
(label_width, label_height), baseline = cv2.getTextSize(label, FONT, FONT_SCALE, FONT_THICKNESS)
label_patch = np.zeros((label_height + baseline, label_width, 3), np.uint8)
label_patch[:,:] = bg_color
现在,在与之前相同的点添加文本,这意味着基线像素将保持在下方:
cv2.putText(label_patch, label, (0, label_height), FONT, FONT_SCALE, label_color, FONT_THICKNESS)
结果:
我有以下 Python 代码:
FONT = cv2.FONT_HERSHEY_SIMPLEX
FONT_SCALE = 1.0
FONT_THICKNESS = 2
bg_color = (255, 255, 255)
label_color = (0, 0, 0)
label = 'Propaganda'
label_width, label_height = cv2.getTextSize(label, FONT, FONT_SCALE, FONT_THICKNESS)[0]
label_patch = np.zeros((label_height, label_width, 3), np.uint8)
label_patch[:,:] = bg_color
我创建了一个新的空白图像,大小为 return getTextSize
,然后,根据文档,我在左下角添加了文本,即 x = 0, y = (height - 1)
并使用与 getTextSize
cv2.putText(label_patch, label, (0, label_height - 1), FONT, FONT_SCALE, label_color, FONT_THICKNESS)
但是当我在图像 label_patch
上使用 imshow
或 imwrite
时,这是我得到的结果:
很容易看出,小写的p
和小写的g
被中间截断了,以至于g
和a
根本就分不清了。如何使 OpenCV 的 getTextSize
return 大小正确,以及如何使 OpenCV 的 putText
从实际最低点开始绘制文本?
找到解决方案,回答自己并希望其他人能从中受益。
原来还有一个参数是getTextSize
returns,就是那个baseline
。我创建的盒子应该考虑到它:它的高度应该是 label_height + baseline
:
(label_width, label_height), baseline = cv2.getTextSize(label, FONT, FONT_SCALE, FONT_THICKNESS)
label_patch = np.zeros((label_height + baseline, label_width, 3), np.uint8)
label_patch[:,:] = bg_color
现在,在与之前相同的点添加文本,这意味着基线像素将保持在下方:
cv2.putText(label_patch, label, (0, label_height), FONT, FONT_SCALE, label_color, FONT_THICKNESS)
结果: