需要源码请点赞关注收藏后评论区留言私信~~~
一、文字的绘制
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() # 释放所有窗体
创作不易 觉得有帮助请点赞关注收藏~~~