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
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'
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV是一款非常强大的计算机视觉库,其中包含了很多功能强大的图像处理和计算机视觉算法。而在这个系列的第三篇文章中,我们将重点介绍如何在OpenCV中绘制图形和文本OpenCV中绘制图形的函数包括cv2.line(直线),cv2.rectangle(矩形),cv2.circle(圆),cv2.ellipse(椭圆)和cv2.putText文本)。这些函数的使用非常简单,只需要指定图像,开始点和结束点(或中心点和半径),颜色和线宽即可。 例如,我们可以使用cv2.rectangle函数在图像上绘制一个矩形: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 cv2.rectangle(img,(384,0),(510,128),(0,255,0),3) # 绘制矩形 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先创建了一个512x512的黑色图像,然后使用cv2.rectangle函数在图像上绘制了一个矩形,并将其显示出来。在这里,矩形的左上角坐标是(384,0),右下角坐标是(510,128),颜色是绿色(0,255,0),线宽为3。 除了绘制图形,我们也可以使用cv2.putText函数在图像上绘制文本。这个函数的使用也非常简单,只需要指定图像文本内容,位置,字体,字体大小和颜色即可。 例如,我们可以使用cv2.putText函数在图像上写入一个“Hello World!”的文本: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 font = cv2.FONT_HERSHEY_SIMPLEX # 设置字体 cv2.putText(img,'Hello World!',(10,500), font, 1,(255,255,255),2,cv2.LINE_AA) # 绘制文本 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们使用cv2.putText函数在左下角绘制了一个“Hello World!”的文本,并将其显示出来。在这里,我们首先选取了字体类型为cv2.FONT_HERSHEY_SIMPLEX,然后指定了文本的位置(10,500),字体大小为1,颜色为白色(255,255,255),线宽为2,并且使用了cv2.LINE_AA参数,以实现更好的文本渲染效果。 综上所述,OpenCV中可以很方便地对图像进行绘制和文本处理,这对于图像处理和计算机视觉应用来说是非常重要的一步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值