OpenCV的`getTextSize`和`putText`返回错误的大小,并用较低的像素分割字母

Som*_*ing 4 opencv opencv-python opencv-text

我有以下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
Run Code Online (Sandbox Code Playgroud)

我创建了一个新的空白图片,其大小由返回getTextSize,然后根据docs在左下角添加文本,该文本x = 0, y = (height - 1)使用相同的字体,比例和粗细参数getTextSize

cv2.putText(label_patch, label, (0, label_height - 1), FONT, FONT_SCALE, label_color, FONT_THICKNESS)
Run Code Online (Sandbox Code Playgroud)

但是当我在图像上使用imshowimwritelabel_patch,这是我得到的结果:

在此处输入图片说明

它可以很容易地看出,小写 p字母和小写g是切在中间,这样ga不能甚至加以区分。如何使OpenCV getTextSize返回正确的大小,如何使OpenCV putText从实际最低点开始绘制文本?

Som*_*ing 8

找到了解决方案,回答自己,并希望其他人将从中受益。

我发现还有另一个getTextSize返回的参数,即基线。我创建的框应该考虑到它:

(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)
Run Code Online (Sandbox Code Playgroud)

现在,在与before相同的位置添加文本,这意味着基线像素将保持在下面:

cv2.putText(label_patch, label, (0, label_height - 1), FONT, FONT_SCALE, label_color, FONT_THICKNESS)
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

  • 我只是在写jeje,而且,您可以从putText的高度中删除-1,这样会得到更好的P (3认同)
  • 我可以从我对 OpenCV 的 `putText` 的短暂体验中给出的另一个提示,总是使用 `font_scale=1`,如果你想缩放它,请使用 OpenCV 的 `resize` 手动进行(并根据你是否选择插值方法)想要放大或缩小它),因为使用不是“1”的字体比例通常会产生扭曲的结果 (2认同)