目标
学习使用OpenCV绘制不同的几何形状
cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等。
画线(cv.line)
要绘制一条线,需要传递线的开始和结束坐标。我们将创建一个黑色图像,并从左上角到右下角在其上绘制一条蓝线。
import numpy as np
import cv2 as cv
# 创建黑色的图像,大小为512x512像素,3个颜色通道(RGB)
img = np.zeros((512, 512, 3), np.uint8)
while 1: # 创建一个无限循环,直到用户按下空格键
# 颜色为白色,线条厚度为50
cv.line(img, (0, 250), (511, 250), (255, 255, 255), 50)
# 显示图像
cv.imshow('line', img)
# 如果用户按下空格键,则退出循环
if cv.waitKey(0) == ord(' '):
break
# 销毁所有OpenCV创建的窗口
cv.destroyAllWindows()
画矩形(cv.rectangle)
cv.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
参数说明:
img:要绘制矩形的图像。
pt1:矩形的一个角的坐标(通常是左上角)。
pt2:矩形对角线上的另一个角的坐标(通常是右下角)。
color:矩形的颜色,以BGR格式指定(即蓝色、绿色、红色的强度)。
thickness:线条的厚度。如果设置为-1(或cv.FILLED),则矩形会被填充。
lineType:线条的类型,例如cv.LINE_8、cv.LINE_AA等。如果未指定,则使用默认值。
shift:坐标点和线条粗细的小数位数。
画圆圈(cv.circle)
cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
参数说明:
img: 这是你想要在其上绘制圆形的图像。它应该是一个NumPy数组,通常是通过读取图像文件或创建空图像得到的。
center: 圆形的中心坐标,是一个包含两个元素的元组或列表,分别表示x和y坐标((x, y))。
radius: 圆形的半径,以像素为单位。
color: 圆形的颜色,是一个包含三个元素的元组或列表,分别表示BGR(蓝色、绿色、红色)的强度。每个颜色的值范围从0到255。
画椭圆(cv.ellipse)
cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
参数说明:
img: 输入输出图像。这个图像可以是单通道灰度图像或多通道彩色图像。
center: 椭圆的中心点坐标,类型为 Point。
axes: 椭圆的长半轴和短半轴的长度,类型为 Size。注意这里的长度是以像素为单位的。
angle: 椭圆绕其中心旋转的角度,以度为单位。正值表示逆时针旋转。
startAngle 和 endAngle: 椭圆弧的起始和终止角度,以度为单位。这两个参数用于绘制椭圆的一部分,而不是整个椭圆。
color: 线条的颜色,用三通道表示(BGR格式)。
thickness: 线条的粗细,默认值为1。如果设置为-1,则表示椭圆将被填充。
lineType: 线条的类型,默认值为 LINE_8。这个参数控制线条的绘制方式,例如是否为抗锯齿等。
shift: 坐标值的小数位数。这个参数通常用于内部计算,以提高精度。用户一般不需要修改它。
画多边形
要绘制多边形,首先需要顶点的坐标。将这些点组成形状为ROWSx1x2的数组,其中ROWS是顶点数,并且其类型应为int32。在这里,我们绘制了一个带有四个顶点的黄色小多边形。
import numpy as np
import cv2 as cv
# 创建黑色的图像,大小为512x512像素,3个颜色通道(RGB)
img = np.zeros((512, 512, 3), np.uint8)
while 1: # 创建一个无限循环,直到用户按下空格键
# 颜色为白色,线条厚度为50
# 创建一个NumPy数组,包含四个二维点,这些点将构成多边形的顶点
# 数组的形状是(4, 2),其中4表示有四个点,2表示每个点有两个坐标(x, y)
pts = np.array([[5, 15], [10, 30], [5, 40], [1, 20]], np.int32)
# 使用reshape函数重新调整数组的形状。这里reshape的参数是(-1, 1, 2)
# -1表示该维度的大小是自动计算的,以使得总的元素数量保持不变
# 1表示中间增加了一个维度,现在数组的形状变成了(4, 1, 2)
# 这意味着现在数组被视为包含4个元素,每个元素是一个1x2的数组(即一个点的坐标)
# 这样做是因为cv.polylines函数要求点的数组是Nx1x2形状的,其中N是多边形的顶点数
pts = pts.reshape((-1, 1, 2))
# 使用cv.polylines函数在图像上绘制多边形
# img是待绘制的图像
# [pts]是将pts数组放在一个列表中,因为cv.polylines函数的第二个参数要求是一个列表的列表(即多边形的列表)
# 这里的列表只包含一个多边形
# True表示多边形是闭合的,即第一个点和最后一个点会自动连接
# (0, 255, 255)是多边形的颜色,这里是青色(在BGR颜色空间中)
cv.polylines(img, [pts], True, (0, 255, 255))
# 显示图像
cv.imshow('line', img)
# 如果用户按下空格键,则退出循环
if cv.waitKey(0) == ord(' '):
break
# 销毁所有OpenCV创建的窗口
cv.destroyAllWindows()
如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状。 cv.polylines()可用于绘制多条线。只需创建要绘制的所有线条的列表,然后将其传递给函数即可。所有线条将单独绘制。与为每条线调用cv.line相比,绘制一组线是一种更好,更快的方法。
向图像添加文本:
# 设置字体样式为 Hershey Simplex,这是一种简单的字体
font = cv.FONT_HERSHEY_SIMPLEX
# 在图像上绘制文本
# 参数说明:
# img: 要绘制文本的图像
# 'OpenCV': 要绘制的文本字符串
# (10,500): 文本左下角的坐标(x, y)
# font: 字体类型
# 4: 字体大小(缩放因子)
# (255,255,255): 文本颜色(BGR格式)
# 2: 文本的线条粗细
# cv.LINE_AA: 抗锯齿线条类型,用于使文本边缘更平滑
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)