OpenCV实战:使用Python绘制直线、矩形与圆形

白榆
白榆
发布时间:2026-10-14| 6人浏览过
原创

本文介绍如何利用OpenCV库在Python中绘制基本几何图形。通过构建NumPy数组作为画布,详细演示了cv2.line()绘制直线、cv2.rectangle()绘制矩形(含填充技巧)以及cv2.circle()绘制同心圆和随机圆的方法。涵盖颜色空间转换、参数设置及随机数生成等关键步骤,帮助读者掌握基础图像处理技能。

OpenCV绘图基础与画布构建

前言

在上一节中,我们利用NumPy数组分割技术在图像上绘制了一个绿色方块。然而,若需绘制单条线条或圆形,NumPy并未提供直接支持的功能。OpenCV提供了相应的绘图函数,本节将详细介绍三种基础的OpenCV绘图方法:


cv2.line() #1
cv2.rectangle() #2
cv2.circle() #3

1 画直线和矩形

在开始使用OpenCV绘制图形之前,我们需要先定义一个画布。


import numpy as np #1
import cv2 #2

canvas = np.zeros((300, 300, 3), dtype="uint8") #3

#1-2:

关于所需包的导入

#3:

我们使用np.zeros()方法构建了一个尺寸为300x300的NumPy数组,并分配了三个颜色通道,分别对应Red(红)、Green(绿)、Blue(蓝)。正如zeros函数名所示,该方法用0填充数组的每个元素。np.zeros()的第二个参数是数据类型dtype。由于我们需要以RGB格式表示图像,其取值范围为[0,255],因此使用“uint8”类型至关重要;若不声明,np.zeros()默认的数据类型为float64。

绘制直线与矩形

1.1 画直线


green = (0, 255, 0) #4
cv2.line(canvas, (0, 0), (300, 300), green) #5
cv2.imshow("Canvas", canvas) #6
cv2.waitKey(0) #7

red = (0, 0, 255) #8
cv2.line(canvas, (300, 0), (0, 300), red, 3) #9
cv2.imshow("Canvas", canvas) #10
cv2.waitKey(0) #11

#4:

我们定义了一个元组来表示绿色。

#5-7:

我们在canvas画布上绘制了一条从坐标(0,0)到(300,300)的绿色直线,显示结果并等待用户按下任意按键。

#8:

我们定义了一个元组来表示红色,再次强调OpenCV采用BGR(蓝绿红)模式而非RGB模式。

#9-11:

我们在canvas上绘制了一条从坐标(300,0)到(0,300)的红色直线,线宽为3像素,这是该函数最后一个参数的含义。随后显示结果并等待按键。

1.2 画矩形


cv2.rectangle(canvas, (10, 10), (60, 60), green) #12
cv2.imshow("Canvas", canvas) #13
cv2.waitKey(0) #14

cv2.rectangle(canvas, (50, 200), (200, 225), red, 5) #15
cv2.imshow("Canvas", canvas) #16
cv2.waitKey(0) #17

blue = (255, 0, 0) #18
cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1) #19
cv2.imshow("Canvas", canvas) #20
cv2.waitKey(0) #21

#12-14:

我们使用了cv2.rectangle()方法,其用法与cv2.line()类似。第一个参数指定在canvas画布上绘图,第二个参数为矩形起始点(10,10),第三个参数为结束点(60,60)。通过这两点定义了一个50x50像素的区域,第四个参数为矩形边框颜色——绿色。随后显示结果并等待按键。

#15-17:

在第15行代码中,正如我们可以控制直线的粗细,也可以控制矩形的线条粗细。此处最后一个参数“5”表示绘制一个边框粗细为5像素的红色矩形,起点为(50, 200),终点为(200, 225)。随后显示结果并等待按键。

#18-21

到目前为止,我们绘制的是图形边框。若需填充边框,操作如下: 在第19行代码中:


cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1) #19

我们绘制了一个起点为(200,50),终点为(225,125)的蓝色矩形。当将最后一个设置线型的参数设为“-1”时,即可得到填充蓝色的实心矩形。

绘制圆形:同心圆与随机圆

2 画圆形

绘制圆形与绘制直线和矩形同样简单,但存在一些差异:

2.1 同心圆


canvas = np.zeros((300, 300, 3), dtype="uint8") #22
(centerX, centerY) = (canvas.shape[1] // 2, canvas.shape[0] // 2) #23
white = (255, 255, 255) #24

for r in range(0, 175, 25): #25
 cv2.circle(canvas, (centerX, centerY), r, white) #26

cv2.imshow("Canvas", canvas) #27
cv2.waitKey(0) #28

for i in range(0, 25): #29
 radius = np.random.randint(5, high=200) #30
 color = np.random.randint(0, high=256, size=(3,)) #31

 pt = np.random.randint(0, high=300, size=(2,)) #32

 cv2.circle(canvas, tuple(pt), radius, color, 1) #33

cv2.imshow("Canvas", canvas) #34
cv2.waitKey(0) #35

#22:

我们将画板重置为空白状态。

#23:

我们定义并计算中心点坐标(centerX, centerY)。在第1节和第2节中均提到,shape[0]表示图片高度,shape[1]表示图片宽度。分别取它们的一半,得到centerY和centerX。

#24:

定义白色像素值。

#25-28:

我们从[0,175)范围内以步长25进行循环,依次获取圆的半径。


cv2.circle(canvas, (centerX, centerY), r, white) #26

然后在第26行通过cv2.circle()进行画圆操作。第一个参数指定在canvas上绘图,第二个参数为圆心,第三个参数为半径,第四个参数为颜色。随后显示结果并等待按键。

2.2 随机圆

让我们增加一些趣味性:


for i in range(0, 25): #29
 radius = np.random.randint(5, high=200) #30
 color = np.random.randint(0, high=256, size=(3,)) #31

 pt = np.random.randint(0, high=300, size=(2,)) #32

 cv2.circle(canvas, tuple(pt), radius, color, -1) #33

cv2.imshow("Canvas", canvas) #34
cv2.waitKey(0) #35

#29:

通过循环表示,我们将绘制25个圆。

#30-32:

绘制圆形需要三个基本元素:半径、颜色和圆心。此处需通过np.random.randint利用NumPy生成随机数的能力。


radius = np.random.randint(5, high=200) #30

在第30行,我们在[5,200)范围内生成随机数作为半径。


color = np.random.randint(0, high=256, size=(3,)) #31

在第31行,我们在[0,256)范围内生成随机数。由于颜色值包含3个通道,我们通过size=(3,)让NumPy返回一个包含三个元素的列表。


pt = np.random.randint(0, high=300, size=(2,)) #32

在第32行,我们在[0,300)范围内生成随机数,通过size=(2,)让NumPy返回一个包含2个元素的列表,表示圆心坐标。

#33:


cv2.circle(canvas, tuple(pt), radius, color, -1) #33

在第33行中,我们调用cv2.circle()方法画圆。第一个参数指定在canvas上画圆,第二个参数为圆心坐标,注意必须是元组,因此使用tuple()将列表强制转换为元组。第三个参数为半径,第四个参数为颜色,第5个参数为“-1”,表示生成实心圆。

#34-35: 显示结果,并等待按下任意按键。

3 完整代码

新建drawing.py


import numpy as np
import cv2

canvas = np.zeros((300, 300, 3), dtype="uint8")
green = (0, 255, 0)
cv2.line(canvas, (0, 0), (300, 300), green)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

red = (0, 0, 255)
cv2.line(canvas, (300, 0), (0, 300), red, 3)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

cv2.rectangle(canvas, (10, 10), (60, 60), green)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

cv2.rectangle(canvas, (50, 200), (200, 225), red, 5)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

blue = (255, 0, 0)
cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

canvas = np.zeros((300, 300, 3), dtype="uint8")
(centerX, centerY) = (canvas.shape[1] // 2, canvas.shape[0] // 2)
white = (255, 255, 255)

for r in range(0, 175, 25):
 cv2.circle(canvas, (centerX, centerY), r, white)

cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

for i in range(0, 25):
 radius = np.random.randint(5, high=200)
 color = np.random.randint(0, high=256, size=(3,))

 pt = np.random.randint(0, high=300, size=(2,))

 cv2.circle(canvas, tuple(pt), radius, color, -1)

cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

4 效果展示

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。