1.线段的绘制
line()方法的语法格式如下:
img = cv2.line(img, pt1, pt2, color, thickness)
# 参数说明
# img:画布
# pt1: 线段的起点坐标
# pt2: 线段的终点坐标
# color:线条颜色
# thickness: 线条宽度
接下来我们使用该方法绘制一个图形吧!!!
import numpy as np
import cv2
# np.zeros():创建了一个画布
# (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
# np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
canvas = np.zeros((300, 300, 3), np.uint8) # 黑色背景
# canvas = np.ones((300, 300, 3), np.uint8) * 255 # 白色背景
# 在画布上,绘制一条起点坐标为(50, 50)、终点坐标为(250, 50),蓝色的,线条宽度为10的线段
canvas = cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 10)
# 在画布上,绘制一条起点坐标为(150, 50)、终点坐标为(150, 250),黄色的,线条宽度为5的线段
canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 5)
# 在画布上,绘制一条起点坐标为(150, 150)、终点坐标为(190, 190),红色的,线条宽度为5的线段
canvas = cv2.line(canvas, (150, 150), (190, 190), (0, 0, 255), 5)
cv2.imshow("Lines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
2.矩形的绘制
2.1 矩形
# rectangle()方法
# img = cv2.rectangle(img, pt1, pt2, color, thickness)
# img:画布
# pt1:左上角坐标
# pt2:右下角坐标
# color: 颜色
# thinckness: 线条宽度
下面是一个绘制矩形边框的实例
import numpy as np import cv2 canvas = np.zeros((300, 300, 3), np.uint8) # 在画布上绘制一个左上角坐标为(50,50),右下角坐标为(200,150),青色的,线条宽度为20的矩形边框 canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 255, 0), 20) cv2.imshow("Rectangle", canvas) # 显示画布 cv2.waitKey() cv2.destroyAllWindows()
下面是一个绘制实心矩形的实例:
import numpy as np import cv2 canvas = np.zeros((300, 300, 3), np.uint8) canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 25, 0), -1) cv2.imshow("Rectangle", canvas) # 显示画布 cv2.waitKey() cv2.destroyAllWindows()
2.2 正方形
实例如下:
import numpy as np import cv2 canvas = np.zeros((300, 300, 3), np.uint8) # 绘制一个左上角坐标为(50,50),右下角坐标为(250,250),红色的,线条宽度为40的正方形边框 canvas = cv2.rectangle(canvas, (50, 50), (250, 250), (0, 0, 255), 40) # 绘制一个左上角坐标为(90,90),右下角坐标为(210,210),绿色的,线条宽度为30的正方形边框 canvas = cv2.rectangle(canvas, (90, 90), (210, 210), (0, 255, 0), 30) # 绘制一个左上角坐标为(120,120),右下角坐标为(180,180),蓝色的,线条宽度为20的正方形边框 canvas = cv2.rectangle(canvas, (120, 120), (180, 180), (255, 0, 0), 20) # 绘制一个左上角坐标为(140,140),右下角坐标为(160,160),橙色的实心正方形 canvas = cv2.rectangle(canvas, (140, 140), (160, 160), (0, 155, 255), -1) cv2.imshow("Square", canvas) # 显示画布 cv2.waitKey() cv2.destroyAllWindows()
3.圆形的绘制
3.1 实心圆
circle()方法的语法格式如下:
img = cv2.circle(img, center, radius, color, thickness)
# center:圆心坐标
# radius:半径
实现代码如下:
import numpy as np import cv2 canvas = np.zeros((100, 300, 3), np.uint8) # 在画布上,绘制一个圆心坐标为(50, 50),半径为40的实心圆形 canvas = cv2.circle(canvas, (50, 50), 40, (0, 255, 255), -1) # 在画布上,绘制一个圆心坐标为(150, 50),半径为40的实心圆形 canvas = cv2.circle(canvas, (150, 50), 40, (85, 125, 255), -1) # 在画布上,绘制一个圆心坐标为(250, 50),半径为40的实心圆形 canvas = cv2.circle(canvas, (250, 50), 40, (50, 125, 200), -1) cv2.imshow("TrafficLights", canvas) # 显示画布 cv2.waitKey() cv2.destroyAllWindows()
3.2 同心圆
import numpy as np import cv2 canvas = np.zeros((300, 300, 3), np.uint8) # shape[1]表示画布的宽度,center_X表示圆心的横坐标 # 圆心的横坐标等于画布的宽度的一半 center_X = int(canvas.shape[1] / 2) # shape[0]表示画布的高度,center_X表示圆心的纵坐标 # 圆心的纵坐标等于画布的高度的一半 center_Y = int(canvas.shape[0] / 2) # r表示半径;其中,r的值分别为0、30、60、90和120 for r in range(0, 150, 30): # [0, 150), 步长30 # 绘制一个圆心坐标为(center_X, center_Y),半径为r,绿色的,线条宽度为5的圆形 cv2.circle(canvas, (center_X, center_Y), r, (90, 125, 90), 5) cv2.imshow("Circles", canvas) # 显示画布 cv2.waitKey() cv2.destroyAllWindows()
3.3 随机实心圆
import numpy as np import cv2 canvas = np.zeros((300, 300, 3), np.uint8) # 通过循环绘制100个实心圆 for numbers in range(0, 101): # 获得随机的圆心横坐标,这个横坐标在[0, 299]范围内取值 center_X = np.random.randint(0, high = 300) # 获得随机的圆心纵坐标,这个纵坐标在[0, 299]范围内取值 center_Y = np.random.randint(0, high = 300) # 获得随机的半径,这个半径在[11, 70]范围内取值 radius = np.random.randint(11, high = 71) # 获得随机的线条颜色,这个颜色由3个在[0, 255]范围内的随机数组成的列表表示 color = np.random.randint(0, high = 256, size = (3,)).tolist() # 绘制一个圆心坐标为(center_X, center_Y),半径为radius,颜色为color的实心圆形 cv2.circle(canvas, (center_X, center_Y), radius, color, -1) cv2.imshow("Circles", canvas) # 显示画布 cv2.waitKey() cv2.destroyAllWindows()
4.多边形的绘制
多边形绘制的polylines()方法语法结构如下:
img = cv2.polylines(img, pts, isClosed, color, thickness)
# pts:由多边形各个顶点坐标组成的数组
# isClosed: 如果值为True, 表示一个闭合的多边形;如果为False, 表示一个不闭合的多边形
实例如下:
import numpy as np
import cv2
canvas = np.zeros((300, 300, 3), np.uint8)
# 按顺时针给出等腰梯形4个顶点的坐标
# 这4个顶点的坐标构成了一个大小等于“顶点个数 * 1 * 2”的数组
# 这个数组的数据类型为np.int32
pts = np.array([[100, 50], [200, 50], [250, 250], [50, 250]], np.int32)
canvas = cv2.polylines(canvas, [pts], True, (0, 255, 255), 5)
cv2.imshow("Polylines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
5.文字的绘制
OpenCV提供了putText()方法实现对文字的绘制, 该方法的语法格式如下:
img = cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
# text: 要绘制的文字内容
# org: 文字在画布中的左下角坐标
# fontFace: 字体样式
# fontScale: 字体大小
# lineType: 线型(默认值为8)
# bottomLeftOrigin: 绘制文字的方向(默认值为False)
下面的可以使用的一些字体样式:
cv2.FONT_HERSHEY_SIMPLEX
: 普通的无衬线字体cv2.FONT_HERSHEY_PLAIN
: 更细的无衬线字体cv2.FONT_HERSHEY_DUPLEX
: 具有一些粗细的无衬线字体cv2.FONT_HERSHEY_COMPLEX
: 复杂的无衬线字体cv2.FONT_HERSHEY_TRIPLEX
: 更复杂的无衬线字体cv2.FONT_HERSHEY_COMPLEX_SMALL
: 小号复杂的无衬线字体cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
: 手写风格字体cv2.FONT_HERSHEY_SCRIPT_COMPLEX
: 更复杂的手写风格字体
import numpy as np
import cv2
canvas = np.zeros((100, 160, 3), np.uint8)
# 在画布上绘制文字“dmsj”,文字左下角的坐标为(20, 70)
# 字体样式为FONT_HERSHEY_TRIPLEX
# 字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "dmsj", (20, 70), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
大家可以修改示例代码体验不同的字体样式(该方法不可以显示中文)
5.1 斜体效果
FONT_ITALIC可以与其他文字类型一起使用
import numpy as np
import cv2
canvas = np.zeros((100, 300, 3), np.uint8)
# 字体样式为FONT_HERSHEY_TRIPLEX和FONT_ITALIC
fontStyle = cv2.FONT_HERSHEY_TRIPLEX + cv2.FONT_ITALIC
cv2.putText(canvas, "dmsj", (20, 70), fontStyle, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
5.2 垂直镜像效果
bottomLeftQrigin值为True时,文字将体现垂直镜像效果
import numpy as np
import cv2
canvas = np.zeros((200, 300, 3), np.uint8)
fontStyle = cv2.FONT_HERSHEY_TRIPLEX
cv2.putText(canvas, "dmsj", (20, 70), fontStyle, 2, (0, 255, 0), 5)
# 使文字“dmsj”呈现垂直镜像效果,这时lineType和bottomLeftOrigin变成了必须参数
# 其中,lineType取默认值8,bottomLeftOrigin的值为True
cv2.putText(canvas, "dmsj", (20, 100), fontStyle, 2, (0, 255, 0), 5, 8, True)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
5.3 图像上绘制文字
import cv2
image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(1).jpg")
fontStyle = cv2.FONT_HERSHEY_TRIPLEX
cv2.putText(image, "pig", (20, 90), fontStyle, 1, (0, 0, 255))
cv2.imshow("Text", image)
cv2.waitKey()
cv2.destroyAllWindows()
6.动态绘制图形
import cv2 import time import numpy as np width, height = 400, 400 # 画面的宽和高 r = 20 # 正方形边长的一半 x = r + 20 # 正方形起始横坐标 y = r + 100 # 正方形起始纵坐标 x_offer = y_offer = 4 # 每一帧的移动速度 while True: # 持续循环直到按下按键 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 # 绘制白色背景面板 # 绘制红色实心正方形 top_left = (int(x - r), int(y - r)) bottom_right = (int(x + r), int(y + r)) cv2.rectangle(img, top_left, bottom_right, (155, 0, 150), -1) cv2.imshow("img", img) # 显示图像 if cv2.waitKey(1) != -1: # 如果按下任何键 break # 退出循环 cv2.destroyAllWindows() # 释放所有窗体
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="ZJp6MePk-1724468284242" src="https://live.csdn.net/v/embed/419735"></iframe>
屏幕录制 2024-08-24 105247
标签:canvas,第三章,cv2,50,画布,OpenCV,np,import,绘制 From: https://blog.csdn.net/2301_80166849/article/details/141489264