OpenCV绘制图形和文字

绘制图形和文字:

OpenCV提供了许多绘制图形的方法,包括绘制线段的line()方法、绘制矩形的rectangle()方法、绘制圆形的circle()方法、绘制多边形的polylines()方法和绘制文字的putText()方法。本章将依次对上述各个方法进行讲解,并使用上述方法绘制相应的图形。

例1:矩形绘制

import cv2
import numpy as np
canvas = np.zeros((300,300,3),np.uint8)
canvas = cv2.rectangle(canvas,(50,50),(200,150),(255,255,0),20)
cv2.imshow("Ping",canvas)
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

例2:多个矩形

import numpy as np
import cv2
canvas = np.zeros((300, 300, 3), np.uint8)
canvas = cv2.rectangle(canvas, (50, 50), (250, 250), (0, 0, 255), 40)
canvas = cv2.rectangle(canvas, (90, 90), (210, 210), (0, 255, 0), 30)
canvas = cv2.rectangle(canvas, (120, 120), (180, 180), (255, 0, 0), 20)
canvas = cv2.rectangle(canvas, (140, 140), (160, 160), (0, 255, 255), -1)
cv2.imshow("Ping", canvas)
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

例3:绘制交通灯

import numpy as np
import cv2
canvas = np.zeros((100, 300, 3), np.uint8)
canvas = cv2.circle(canvas, (50, 50), 40, (0, 0, 255), -1)
# 在画布上,绘制一个圆心坐标为(150, 50),半径为40,黄色的实心圆形
canvas = cv2.circle(canvas, (150, 50), 40, (0, 255, 255), -1)
# 在画布上,绘制一个圆心坐标为(250, 50),半径为40,绿色的实心圆形
canvas = cv2.circle(canvas, (250, 50), 40, (0, 255, 0), -1)
cv2.imshow("Ping", canvas)
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

例4:绘制同心圆

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):
    # 绘制一个圆心坐标为(center_X, center_Y),半径为r,绿色的,线条宽度为5的圆形
    cv2.circle(canvas, (center_X, center_Y), r, (0, 255, 0), 5)
cv2.imshow("Circles", canvas)  # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

例5:绘制随机圆

import cv2
import numpy as np
canvas = np.zeros((300,300,3),np.uint8)
for numbers in range(0,100):
	x = np.random.randint(0,300)
	y = np.random.randint(0,300)
	color = np.random.randint(265,size = (3,)).tolist()
	cv2.circle(canvas,(x,y),np.random.randint(2,10),color,-1)
cv2.imshow("Ping",canvas)
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

例5:绘制多边形

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)
# 在画布上根据4个顶点的坐标,绘制一个闭合的,红色的,线条宽度为5的等腰梯形边框
canvas = cv2.polylines(canvas, [pts], True, (250, 0, 255), 10)
cv2.imshow("Ping", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

例6:绘制文字

import numpy as np 
import cv2
canvas = np.zeros((300, 300, 3), np.uint8)

cv2.putText(canvas, "OpenCV", (20, 70), cv2.FONT_HERSHEY_TRIPLEX, 2, (0, 255, 0), 5)
cv2.putText(canvas, "OpenCV", (20, 150), cv2.FONT_HERSHEY_TRIPLEX + cv2.FONT_ITALIC, 2, (0, 255, 0), 5)
cv2.putText(canvas, "OpenCV", (20, 210), cv2.FONT_HERSHEY_TRIPLEX, 2, (0, 255, 0), 5,8,True)

cv2.imshow("Ping", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

效果呈现:
在这里插入图片描述

字体样式:
在这里插入图片描述

例7:动态图形绘制

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

效果呈现:
在这里插入图片描述

程序说明:

np.zeros((300, 300, 3), np.uint8)

np.zeros():创建了一个画布
(300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8

cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift)

img: 要绘制矩形的图像。
pt1: 矩形的左上角顶点坐标,格式为 (x1, y1)。
pt2: 矩形的右下角顶点坐标,格式为 (x2, y2)。
color: 矩形的颜色,可以是一个表示颜色的元组或标量值。例如,(255, 0, 0) 表示红色。
thickness(可选): 矩形边框的粗细,默认值为1。可以指定不同的整数值以改变矩形边框的粗细。厚度
lineType(可选): 矩形边框的类型,默认值为 8(连接线段),可选的值有:4(连接矩形填充),8(连接线段),16(连接抗锯齿线段)。
shift(可选): 坐标点的小数位数,默认值为0。

cv2.line(img, pt1, pt2, color, thickness, lineType, shift)

img: 要绘制直线的图像。
pt1: 直线的起点坐标,格式为 (x1, y1)。
pt2: 直线的终点坐标,格式为 (x2, y2)。
color: 直线的颜色,可以是一个表示颜色的元组或标量值。例如,(255, 0, 0) 表示红色。
thickness(可选): 直线的粗细,默认值为1。可以指定不同的整数值以改变直线的粗细。
lineType(可选): 直线的类型,默认值为 8(连接线段),可选的值有:4(连接矩形填充),8(连接线段),16(连接抗锯齿线段)。
shift(可选): 坐标点的小数位数,默认值为0。

cv2.circle(img, center, radius, color, thickness, lineType, shift)

img:要绘制圆形的图像。
center:圆心的坐标,格式为 (x, y)。
radius:圆的半径。
color:圆的颜色,可以是一个表示颜色的元组或标量值。
thickness(可选):圆边界的粗细,默认为1。
lineType(可选):圆边界的类型,默认为8,可选的类型有:4(连接圆边界填充),8(连接线段),16(连接抗锯齿线段)。
shift(可选):圆心坐标值的小数位数,默认为0。

cv2.polylines(img, pts, isClosed, color, thickness, lineType, shift)

img:要绘制多边形的图像。
pts:一个包含多个点坐标的列表或数组。每个点都表示为 (x, y) 形式的元组或数组。
isClosed:一个布尔值,指定多边形是否封闭。如果设置为 True,则会绘制首尾相连的线段,创建封闭的多边形。如果设置为 False,则只会绘制线段,不封闭多边形。
color:多边形的颜色。可以是表示颜色的整数(例如 255 表示白色),或者是一个包含三个通道值的列表或数组,表示 RGB 颜色(例如 [255, 0, 0] 表示红色)。
thickness:线段的宽度,以像素为单位。默认值为 1。
lineType:线段类型,用于控制线段的外观。默认值为 cv2.LINE_8。
shift:坐标点值的小数点位数。默认值为 0,表示坐标点是整数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值