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


    1. 学习目标

    1. 学会使用 cv.putText 函数向图像添加文本;
    2. 学会使用 cv.getTextSize 函数获取绘制文本占用的宽高等属性。

    2. 绘制文本 cv.putText 函数说明

    2.1 函数使用
    cv.putText(img, text, pos, fontFace,fontScale,color[, thickness[, lineType[, bottomLeftOrigin]]]) → img
    
    • 1
    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)
    
    • 1
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    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
    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'
    
    • 1
  • 相关阅读:
    Linux 常用命令
    node.js+vscode安装与配置
    性能监控-grafana+prometheus+node_exporter
    【SQL 中级语法 2】自连接的用法
    数据库基础与MySQL入门
    blade-build如何创建和使用动态库(.so)
    Spring Boot整合Zookeeper详细教程
    【神印王座】龙皓晨竟然上了头版头条!内容违背,新闻真实性原则
    Java学习之封装
    无涯教程-Flutter - 简介
  • 原文地址:https://blog.csdn.net/m0_38082783/article/details/127556861