import numpy as np # 导入Python中的numpy模块
import cv2
# ——————————————————————————线段的绘制
# img = cv2.line(img,pt1,pt2,color,thickness) #参数依次是:画布、线段起点坐标、线段终点坐标、线条颜色、线条宽度
canvas = np.zeros((300, 300, 3), np.uint8) #创建一个300*300三通道类型画布,以unit8类型聚合而成)(np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8)
# canvas = np.ones((300, 300, 3), np.uint8)*255 #产生白色画布
canvas = cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 5) # 在画布上,绘制一条起点坐标为(50, 50)、终点坐标为(250, 50),蓝色的,线条宽度为5的线段
canvas = cv2.line(canvas, (50, 150), (250, 150), (0, 255, 0), 5)
cv2.imshow("Lines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————矩形边框的绘制(正方形是特殊的矩形)
# img = cv2.rectangle(img,pt1,pt2,color,thickness) #参数依次是画布、矩形左上角坐标、矩形右下角坐标、线条颜色、线条宽度(线条宽度为-1即为实心矩形)
canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 255, 0), 20) # 在画布上绘制一个左上角坐标为(50,50),右下角坐标为(200,150),青色的,线条宽度为20的矩形边框
cv2.imshow("Rectangle", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————圆形的绘制
# img = cv2.circle(img,center,radius,color,thickness) #参数依次是画布、圆心坐标、半径、线条颜色、线条宽度(线条宽度为-1即为实心)
canvas = cv2.circle(canvas, (50, 50), 40, (0, 0, 255), -1) #在画布上,绘制一个圆心坐标为(50, 50),半径为40,红色的实心圆形
cv2.imshow("TrafficLights", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————获得[11, 70]范围内的三个随机值和转换成列表,opencv中的颜色值是列表
radius = np.random.randint(11, high=71,size = (3,)).tolist()
# ——————————————————————————多边形的绘制(绘制多边形时,是按照列表中的点按顺序连接)
# img = cv2.polylines(img,pts,isClosed,color,thickness) #参数依次是画布、由多边形各个顶点的坐标组成的列表、True为闭合多边形反之不闭合、
pts = np.array([[100, 50], [200, 50], [250, 250], [50, 250]], np.int32)#这个数组的数据类型为np.int32
canvas = cv2.polylines(canvas, [pts], True, (0, 0, 255), 5) #在画布上根据4个顶点的坐标,绘制一个闭合的,红色的,线条宽度为5的等腰梯形边框
cv2.imshow("Polylines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————文字的绘制(这种方法绘制中文出问题、thickness,lineType,bottomLeftOriginw为可选参数)
# img = cv2.putText(img,text,org,fontFace,fontScale,color,thickness,lineType,bottomLeftOrigin) 参数依次为:画布,文字内容,左下角下标,字体样式,字体大小,线条颜色,线条宽度,线性(线的产生算法有4、8两个值,默认为8),绘制文字时的方向默认false正写,True为镜像写
#如:cv2.putText(canvas,"mrsoft",(20,100),fontStyle,2,(0,255,0),5,8,True)
cv2.putText(canvas, "mrsoft", (20, 70), cv2.FONT_HERSHEY_TRIPLEX, 2, (0, 255, 0), 5) # 在画布上绘制文字“mrsoft”,文字左下角的坐标为(20, 70),字体样式为FONT_HERSHEY_TRIPLEX字体大小为2,线条颜色是绿色,线条宽度为5
fontStyle = cv2.FONT_HERSHEY_TRIPLEX+cv2.FONT_ITALIC #有文字样式且附带斜体效果,FONT_ITALIC为斜体,与其他字体连用,字体呈现指定样式且斜体
cv2.putText(canvas,"mrsoft",(20,70),fontStyle,2,(0,255,0),5) # 在画布上绘制文字“mrsoft”,文字左下角的坐标为(20, 70)字体样式为fontStyle,字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "mrsoft", (20, 100), fontStyle, 2, (0, 255, 0), 5, 8, True) # 使文字“mrsoft”呈现垂直镜像效果,这时lineType和bottomLeftOrigin变成了必须参数
image = cv2.imread("2.1.jpg")
cv2.putText(image, "Flower", (20, 90), fontStyle, 1, (0, 255, 255)) #参数依次为:图像,文字,文字左下角坐标,字体样式,大小,颜色
cv2.imshow("Text", canvas)
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————动态图形的绘制(主要:图片逐渐移动,每秒显示60帧图片实现动态)
import time
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()