OpenCV-Python学习(12)—— OpenCV 向图像添加文本(cv.putText、cv.getTextSize)

746 阅读3分钟

1. 学习目标

  1. 学会使用 cv.putText 函数向图像添加文本;
  2. 学会使用 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. 总结

  1. 函数 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'
  1. 函数 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'