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 实例运行结果

opencv图片添加alpha opencv 添加文字_学习

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 实例运行结果

opencv图片添加alpha opencv 添加文字_学习_02

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'