OpenCV文本绘制详解

2,110 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

前言

我们已经知道绘图在计算机视觉项目中的重要性,并且学习了如何使用 OpenCV 绘制图形,OpenCV 也可用于在图像中渲染文本。接下来,将介绍如何使用 cv2.putText() 函数绘制文本,然后介绍 OpenCV 中所有的可用字体,最后,了解一些与文本绘制相关的其它 OpenCV 函数。

绘制文本

cv2.putText() 函数的用法如下:

img = cv.putText(img, text, org, fontFace, fontScale, color, thickness=1, lineType= 8, bottomLeftOrigin=False)

此函数使用 fontFace 声明的字体类型和 fontScale 因子从 org 坐标(如果 bottomLeftOrigin = False 则为左上角,否则为左下角)开始绘制提供的文本字符串 text。最后提供的参数 lineType 同样可以使用三个不同的可选值: cv2.LINE_4 、 cv2.LINE_8 和 cv2.LINE_AA:

cv2.putText(image, 'learn OpenCV-Python together', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, colors['cyan'], 2, cv2.LINE_4)
cv2.putText(image, 'learn OpenCV-Python together', (10, 230), cv2.FONT_HERSHEY_SIMPLEX, 0.9, colors['cyan'], 2, cv2.LINE_8)
cv2.putText(image, 'learn OpenCV-Python together', (10, 430), cv2.FONT_HERSHEY_SIMPLEX, 0.9, colors['cyan'], 2, cv2.LINE_AA)
show_with_matplotlib(image, 'cv2.putText()')

绘制文本

OpenCV 文本字体

OpenCV中所有可用的字体如下:

FONT_HERSHEY_SIMPLEX = 0
FONT_HERSHEY_PLAIN = 1
FONT_HERSHEY_DUPLEX = 2
FONT_HERSHEY_COMPLEX = 3
FONT_HERSHEY_TRIPLEX = 4
FONT_HERSHEY_COMPLEX_SMALL = 5
FONT_HERSHEY_SCRIPT_SIMPLEX = 6
FONT_HERSHEY_SCRIPT_COMPLEX = 7

由于所有这些字体都在 (0-7) 范围内,我们可以迭代并调用 cv2.putText() 函数,改变 colorfontFaceorg 参数,使用所有可用字体进行绘制:

fonts = {0: "FONT HERSHEY SIMPLEX", 1: "FONT HERSHEY PLAIN", 2: "FONT HERSHEY DUPLEX", 3: "FONT HERSHEY COMPLEX",
         4: "FONT HERSHEY TRIPLEX", 5: "FONT HERSHEY COMPLEX SMALL ", 6: "FONT HERSHEY SCRIPT SIMPLEX",
         7: "FONT HERSHEY SCRIPT COMPLEX"}
index_colors = {0: 'blue', 1: 'green', 2: 'red', 3: 'yellow', 4: 'magenta', 5: 'cyan', 6: 'black', 7: 'dark_gray'}
image = np.zeros((650, 650, 3), dtype="uint8")
image[:] = colors['gray']

position = (10, 30)
for i in range(0, 8):
	cv2.putText(image, fonts[i], position, i, 1.1, colors[index_colors[i]], 2, cv2.LINE_4)
	position = (position[0], position[1] + 40)
	cv2.putText(image, fonts[i].lower(), position, i, 1.1, colors[index_colors[i]], 2, cv2.LINE_4)
	position = (position[0], position[1] + 40)
	
show_with_matplotlib(image, 'cv2.putText() using all OpenCV fonts')

结果如下:

OpenCV 文本字体

其它与文本相关的函数

为了更好的进行文本的绘制,OpenCV 还提供了其它与文本绘制相关的函数,这些函数不是用来绘制文本的,而是用来补充 cv2.putText() 函数。第一个函数是 cv2.getFontScaleFromHeight()

retval = cv2.getFontScaleFromHeight(fontFace, pixelHeight, thickness=1)

此函数返回字体比例(这是在 cv2.putText() 函数中使用的参数 fontScale),以得到提供的高度(以像素为单位)并考虑字体类型 (fontFace) 和 thickness。 第二个函数是 cv2.getTextSize() :

retval, baseLine = cv2.getTextSize(text, fontFace, fontScale, thickness)

此函数根据以下参数:要绘制的 text、字体类型 (fontFace)、scalethickness,获取文本大小(宽度和高度)。此函数返回 sizebaseLine (它对应于相对于文本底部的基线的 y 坐标):

image = np.zeros((700, 700, 3), dtype="uint8")
image[:] = colors['gray']
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 2.5
thickness = 5
text = 'abcdefghijklmnopqrstuvwxyz'
circle_radius = 10
ret, baseline = cv2.getTextSize(text, font, font_scale, thickness)
text_width, text_height = ret
text_x = int(round((image.shape[1] - text_width) / 2))
text_y = int(round((image.shape[0] + text_height) / 2))
cv2.circle(image, (text_x, text_y), circle_radius, colors['green'], -1)
cv2.rectangle(image, (text_x, text_y + baseline), (text_x + text_width - thickness, text_y - text_height), colors['blue'], thickness)
cv2.circle(image, (text_x, text_y + baseline), circle_radius, colors['red'], -1)
cv2.circle(image, (text_x + text_width - thickness, text_y - text_height), circle_radius, colors['cyan'], -1)
cv2.line(image, (text_x, text_y + int(round(thickness/2))), (text_x + text_width - thickness, text_y + int(round(thickness/2))), colors['yellow'], thickness)
cv2.putText(image, text, (text_x, text_y), font, font_scale,colors['magenta'], thickness)
show_with_matplotlib(image, 'cv2.getTextSize() + cv2.putText()')

绘制结果如下图所示:

文本

相关链接

OpenCV绘图基础详解

OpenCV图形绘制详解