OpenCV(绘图功能笔记)

目标

学习使用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)
相关推荐
funfan051713 分钟前
GPT-5博士级AI使用教程及国内平替方案
人工智能·gpt
萤丰信息31 分钟前
技术赋能安全:智慧工地构建城市建设新防线
java·大数据·开发语言·人工智能·智慧城市·智慧工地
岑梓铭37 分钟前
考研408《计算机组成原理》复习笔记,第五章(1)——CPU功能和结构
笔记·考研·408·计算机组成原理·计组
AI视觉网奇1 小时前
音频分类模型笔记
人工智能·python·深度学习
Dante但丁1 小时前
手扒Github项目文档级知识图谱构建框架RAKG(保姆级)Day4
人工智能
用户5191495848451 小时前
使用JavaScript与CSS创建"移动高亮"导航栏
人工智能·aigc
Java中文社群1 小时前
淘宝首位程序员离职,竟投身AI新公司做这事!
人工智能·后端·程序员
失散131 小时前
自然语言处理——02 文本预处理(上)
人工智能·自然语言处理
Listennnn2 小时前
nuScence数据集
人工智能
duration~2 小时前
SpringAI集成MCP
人工智能·后端·spring·ai