1. 学习目标
- 学会使用 cv.putText 函数向图像添加文本;
- 学会使用 cv.getTextSize 函数获取绘制文本占用的宽高等属性。
2. 绘制文本 cv.putText 函数说明
2.1 函数使用
cv.putText(img, text, pos, fontFace,fontScale,color[, thickness[, lineType[, bottomLeftOrigin]]]) → img
2.2 参数说明
参数 | 说明 |
img | 表示输入图像,允许单通道灰度图像或多通道彩色图像。 |
text | 表示添加的文本字符串。 |
pos | 表示文本字符串 左下角坐标 ,(x, y) 格式的元组。 |
fontFace | 表示字体类型。 |
fontScale | 表示字体缩放比例因子。 |
color | 表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。 |
thickness | 表示绘制直线的粗细,默认值 1px,-1 表示内部填充。 |
lineType | 表示绘制直线的线性,默认为 LINE_8。 |
bottomLeftOrigin | 表示为可选参数,默认值 True 表示数据原点位于左下角,False 表示位于左上角。 |
2.3 fontFace 值说明
值 | 描述 |
cv.FONT_HERSHEY_SIMPLEX | 表示正常大小无衬线字体。 |
cv.FONT_HERSHEY_PLAIN | 表示小号无衬线字体。 |
cv.FONT_HERSHEY_DUPLEX | 表示正常大小无衬线字体,比FONT_HERSHEY_SIMPLEX更复杂。 |
cv.FONT_HERSHEY_COMPLEX | 表示正常大小有衬线字体。 |
cv.FONT_HERSHEY_TRIPLEX | 表示正常大小有衬线字体,比FONT_HERSHEY_COMPLEX更复杂。 |
cv.FONT_HERSHEY_COMPLEX_SMALL | 表示FONT_HERSHEY_COMPLEX的小译本。 |
cv.FONT_HERSHEY_SCRIPT_SIMPLEX | 表示手写风格字体。 |
cv.FONT_HERSHEY_SCRIPT_COMPLEX | 表示手写风格字体,比FONT_HERSHEY_SCRIPT_SIMPLEX更复杂。 |
cv.FONT_ITALIC | 表示相应字体的斜体字。 |
2.4 lineType 值说明
值 | 描述 |
cv.LINE_4 | 表示 4 邻接线型。 |
cv.LINE_8 | 表示 8 邻接线型。 |
cv.LINE_AA | 表示抗锯齿线型,图像更平滑。 |
2.5 注意
OpenCV 不支持显示中文字符,使用 cv.putText() 时添加的文本字符串不能包含中文字符(包括中文标点符号)!!!
3. 获取文本属性 cv.getTextSize 函数说明
3.1 函数使用
cv.getTextSize(text, fontFace, fontScale, thickness)
3.2 参数说明
参数 | 说明 |
text | 表示添加的文本字符串。 |
fontFace | 表示字体类型。 |
fontScale | 表示字体缩放比例因子。 |
thickness | 表示绘制直线的粗细,默认值 1px,-1 表示内部填充。 |
3.3 返回参数说明
返回参数 | 说明 |
(fw,fh) | 表示文本区域大小的宽高。 |
bh | 表示字体基线baseline位置。 |
4. 绘制文本实例
4.1 实例代码
import cv2 as cv
def draw_text():
img = cv.imread("./images/messi5.jpg")
font_faces = [
cv.FONT_HERSHEY_SIMPLEX,
cv.FONT_HERSHEY_PLAIN,
cv.FONT_HERSHEY_DUPLEX,
cv.FONT_HERSHEY_COMPLEX,
cv.FONT_HERSHEY_TRIPLEX,
cv.FONT_HERSHEY_COMPLEX_SMALL,
cv.FONT_HERSHEY_SCRIPT_SIMPLEX,
cv.FONT_HERSHEY_SCRIPT_COMPLEX,
cv.FONT_ITALIC
]
text = "Rattenking learning OpenCV-Python!"
for i in range(len(font_faces)):
pos = (20, 40 * (i + 1))
cv.putText(img, text, pos, font_faces[i], 0.7, (255,255,255), 1, cv.LINE_AA)
cv.imshow("text img", img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
draw_text()
4.2 实例运行结果
5. 通过 cv.getTextSize 获取文本宽高属性绘制
5.1 实例代码
import cv2 as cv
def draw_text():
img = cv.imread("./images/messi5.jpg")
font_faces = [
cv.FONT_HERSHEY_SIMPLEX,
cv.FONT_HERSHEY_PLAIN,
cv.FONT_HERSHEY_DUPLEX,
cv.FONT_HERSHEY_COMPLEX,
cv.FONT_HERSHEY_TRIPLEX,
cv.FONT_HERSHEY_COMPLEX_SMALL,
cv.FONT_HERSHEY_SCRIPT_SIMPLEX,
cv.FONT_HERSHEY_SCRIPT_COMPLEX,
cv.FONT_ITALIC
]
text = "Rattenking learning OpenCV-Python!"
for i in range(len(font_faces)):
pos = (20, 40 * (i + 1))
(fw,fh),bh = cv.getTextSize(text, font_faces[i], 0.7, 1)
cv.putText(img, text, pos, font_faces[i], 0.7, (255,255,255), 1, cv.LINE_AA)
end_pos = (20 + fw, 40 * (i + 1))
cv.line(img, pos, end_pos, (255,0,0), 1)
cv.line(img, (20, 40 * (i + 1) + bh), (20 + fw, 40 * (i + 1) + bh), (0,0,255), 1)
cv.imshow("text img", img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
draw_text()
5.2 实例运行结果
6. 总结
- 函数 cv.putText 的参数 thickness 不能为负数,负数报错;
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\drawing.cpp:1711: error: (-215:Assertion failed) 0 <= shift && shift <= XY_SHIFT && thickness >= 0 in function 'cv::PolyLine'
- 函数 cv.line 的参数 thickness 不能为负数,负数报错。
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\drawing.cpp:1802: error: (-215:Assertion failed) 0 < thickness && thickness <= MAX_THICKNESS in function 'cv::line'