OpenCV实战:使用Python绘制直线、矩形与圆形
本文介绍如何利用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 效果展示



以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













