OpenCV中文字的绘制与动态绘制图形讲解与实战(附Python源码)

简介: OpenCV中文字的绘制与动态绘制图形讲解与实战(附Python源码)

需要源码请点赞关注收藏后评论区留言私信~~~

一、文字的绘制

OpenCV提供了用于绘制文字的putText方法,使用这个方法不仅能够设置字体的样式,大小和颜色,而且能够使字体呈现斜体的效果,还能够控制文字的方向,进而使文字呈现垂直镜像的效果,语法格式如下

img=cv2.putText(img,text,org,fontFace,fontScale,color,thickness,lineType,bottomLeftOrigin)

text要绘制的文字内容

org 文字在画布中的左下角坐标

fontFace 字体样式

fontScale 字体大小

lineType 线型

bottomLeftOrigin 绘制文字时的方向

字体样式及其含义如下表所示

绘制文字实例如下

import numpy as np # 导入Python中的numpy模块
import cv2
# np.zeros():创建了一个画布
# (100, 300, 3):一个100 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
# np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
canvas = np.zeros((100, 300, 3), np.uint8)
# 在画布上绘制文字“mrsoft”,文字左下角的坐标为(20, 70)
# 字体样式为FONT_HERSHEY_TRIPLEX
# 字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "mrsoft", (20, 70), cv2.FONT_HERSHEY_TRIPLEX, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

文字的斜体效果

FONT_ITALIC可以与其他文字类型一起使用,使得字体在呈现指定字样样式效果的同时,也呈现斜体效果

import numpy as np # 导入Python中的numpy模块
import cv2
# np.zeros():创建了一个画布
# (100, 300, 3):一个100 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
# np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
canvas = np.zeros((100, 300, 3), np.uint8)
# 字体样式为FONT_HERSHEY_TRIPLEX和FONT_ITALIC
fontStyle = cv2.FONT_HERSHEY_TRIPLEX + cv2.FONT_ITALIC
# 在画布上绘制文字“mrsoft”,文字左下角的坐标为(20, 70)
# 字体样式为fontStyle,字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "mrsoft", (20, 70), fontStyle, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

文字的垂直镜像效果

bottomLeftOrigin可以控制绘制文字时的方向的参数,当它的值为True时,文字将呈现垂直镜像效果

import numpy as np # 导入Python中的numpy模块
import cv2
# np.zeros():创建了一个画布
# (200, 300, 3):一个200 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
# np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
canvas = np.zeros((200, 300, 3), np.uint8)
# 字体样式为FONT_HERSHEY_TRIPLEX
fontStyle = cv2.FONT_HERSHEY_TRIPLEX
# 在画布上绘制文字“mrsoft”,文字左下角的坐标为(20, 70)
# 字体样式为fontStyle,字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "mrsoft", (20, 70), fontStyle, 2, (0, 255, 0), 5)
# 使文字“mrsoft”呈现垂直镜像效果,这时lineType和bottomLeftOrigin变成了必须参数
# 其中,lineType取默认值8,bottomLeftOrigin的值为True
cv2.putText(canvas, "mrsoft", (20, 100), fontStyle, 2, (0, 255, 0), 5, 8, True)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

在图像上绘制文字

OpenCV除了可以在np.zeros创建的画布上绘制文字外,还能够在图像上绘制文字,区别是当在图像上绘制文字时,不再需要导入python的numpy模块

import cv2
image = cv2.imread("2.1.jpg") # 读取D盘根目录下的2.1.jpg
# 字体样式为FONT_HERSHEY_TRIPLEX
fontStyle = cv2.FONT_HERSHEY_TRIPLEX
# 在2.1.jpg上绘制文字“mrsoft”,文字左下角的坐标为(20, 90)
# 字体样式为fontStyle,字体大小为1,线条颜色是黄色
cv2.putText(image, "Flower", (20, 90), fontStyle, 1, (0, 255, 255))
cv2.imshow("Text", image) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

二、动态绘制图形

下面我们来绘制一个动态的图形,一个小球在图像中做匀速直线运动,如果碰到边界则无动能损失的反弹 我们在一个二维平面中操作

动画实际上是由多幅画面在短时间内交替放映实现的视觉效果,每一幅画面被称为一帧,所谓的60帧就是一秒放映了60幅画面,使用time模块每60分之1秒计算一次小球的移动轨迹,并将移动后的结果绘制到图像上 这样1秒有60幅图像交替放映,就可以看到弹球的动画效果了

小球在4个方向的速度

小球的移动轨迹

实战效果如下 小球将自己运动

import cv2
import time
import numpy as np
width, height = 200, 200  # 画面的宽和高
r = 20  # 圆半径
x = r + 20  # 圆心和坐标起始坐标
y = r + 100  # 圆形纵坐标起始坐标
x_offer = y_offer = 4  # 每一帧的移动速度
while cv2.waitKey(1) == -1:  # 按下任何按键之后
    if x > width - r or x < r:  # 如果圆的横坐标超出边界
        x_offer *= -1  # 横坐标速度取相反值
    if y > height - r or y < r:  # 如果圆的纵坐标超出边界
        y_offer *= -1  # 纵坐标速度取相反值
    x += x_offer  # 圆心按照横坐标速度移动
    y += y_offer  # 圆心按照纵坐标速度移动
    img = np.ones((width, height, 3), np.uint8) * 255  # 绘制白色背景面板
    cv2.circle(img, (x, y), r, (255, 0, 0), -1)  # 绘制圆形
    cv2.imshow("img", img)  # 显示图像
    time.sleep(1 / 60)  # 休眠1/60秒,也就是秒60帧
cv2.destroyAllWindows()  # 释放所有窗体

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
6天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
1天前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
12 5
|
2天前
|
数据可视化 Python
Python的分子模拟动态促进DF Theory理论对二进制硬盘系统的适用性
Python的分子模拟动态促进DF Theory理论对二进制硬盘系统的适用性
|
4天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
9 0
|
6天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
8天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
29 6
|
9天前
|
Python
Python动态IP代理防止被封的方法
Python动态IP代理防止被封的方法
|
9天前
|
机器学习/深度学习 算法 自动驾驶
opencv python 图片叠加
【4月更文挑战第17天】
|
11天前
|
API 调度 开发者
深入理解Python异步编程:从Asyncio到实战应用
在现代软件开发中,异步编程技术已成为提升应用性能和响应速度的关键策略。本文将通过实例讲解Python中的异步编程核心库Asyncio的基本概念、关键功能以及其在Web开发中的应用。我们不仅将理论与实践结合,还将展示如何通过实际代码示例解决常见的并发问题,帮助开发者更有效地利用Python进行异步编程。
|
Linux C语言 开发者
源码安装Python学会有用还能装逼 | 解决各种坑
相信朋友们都看过这个零基础学习Python的开篇了
376 0
源码安装Python学会有用还能装逼 | 解决各种坑