概述
在图像处理和计算机视觉领域,OpenCV 是一个非常强大的工具包。它提供了许多函数来帮助开发者完成图像处理任务,包括绘制基本图形。本文将详细介绍如何使用 OpenCV 在 Python 中绘制基本图形,并通过具体的代码示例来展示整个过程。
环境准备
在开始之前,请确保已经安装了 OpenCV 库。如果没有安装,可以通过以下命令进行安装:
pip install opencv-python
示例代码详解
import cv2
import numpy as np
def draw_img():
"""
绘制图像
:return:
"""
# 创建空白图像
"""
这行代码的作用是创建一个空的图像数组。我们逐步分解并详细解释如下:
np.zeros(...):
这是NumPy库中的一个函数,用于创建一个指定形状的数组并填充为零。
在这个上下文中,我们使用np.zeros()来初始化一个图像的数组。
shape=(512, 512, 3):
shape参数是一个元组,指定了数组的形状。
(512, 512)表示图像的高度和宽度都是512像素,它是一个正方形的图像。
3表示图像的颜色通道数,通常在OpenCV中是指蓝色、绿色和红色(BGR顺序)。因此,这个数组有三个通道。
dtype=np.uint8:
dtype参数指定数组中元素的数据类型。
np.uint8表示无符号8位整数,取值范围是0到255,这个范围适合表示RGB颜色值。每个颜色通道的像素值都在这个范围内。
总结而言,这行代码用于创建一个512x512像素的空图像,初始颜色为黑色(因为所有的像素值都被初始化为0)。这个图像可以用来后续的绘制和图像处理。主要功能是在内存中分配一个用于图像处理的基础数组。
"""
img = np.zeros(shape=(512, 512, 3), dtype=np.uint8)
# 通道顺序为BGR
print(img.shape)
# 高、宽、通道
# img[:, :, :] = 255, 0, 0
# img[200:400, 0:250, :] = 255, 0, 0
'''
cv2.line(img, pt1, pt2, color, thickness)
这行代码使用OpenCV库中的cv2.line函数在图像上绘制一条直线。下面逐步分解并详细解释各个参数及其功能:
函数名称:
cv2.line():这是OpenCV中用于绘制直线的函数。
参数:
img:这是要在其上绘制直线的图像数组。这个图像是在之前代码中创建的一个512x512像素的空图像。
pt1=(10, 10):这个参数指定了直线起点的坐标。在此例中,直线的起点是图像的坐标(10, 10),表示距离图像左上角10个像素宽和10个像素高的位置。
pt2=(100, 200):这个参数指定了直线终点的坐标。直线的终点是图像的坐标(100, 200),表示距离左上角100个像素宽和200个像素高的位置。
color=(0, 0, 255):这是直线的颜色,格式为BGR(蓝、绿、红)值。在这里,(0, 0, 255)表示红色。
thickness=3:这是绘制直线的宽度,单位为像素。在这个例子中,直线的宽度为3个像素。
'''
cv2.line(img, pt1=(10, 10), pt2=(100, 200), color=(0, 0, 255), thickness=3)
'''
pt2=(img.shape[1], 300):这个参数指定了直线的终点坐标。img.shape[1]返回图像的宽度(512),因此终点坐标是(512, 300),
即直线终点在图像的右侧表示直线的终点在图像的右侧,水平坐标为512,垂直坐标仍然是300,即直线与起点同高度。
'''
cv2.line(img, pt1=(0, 300), pt2=(img.shape[1], 300), color=(0, 128, 255), thickness=1)
# cv2.rectangle():这是OpenCV中用于绘制矩形的函数。
# thickness=cv2.FILLED:这个参数指定矩形的边框厚度。在本例中,使用cv2.FILLED常量表示矩形将被填充为指定颜色,而不是仅绘制边框。
cv2.rectangle(img, pt1=(200, 100), pt2=(img.shape[1], 200), color=(255, 0, 0), thickness=cv2.FILLED)
# cv2.circle():这是OpenCV中用于绘制圆形的函数。radius=30:这个参数指定了圆的半径。值30表示这个圆的半径为30像素。
cv2.circle(img, center=(50, 250), radius=30, color=(255, 255, 0), thickness=1)
"""
函数名称:
cv2.putText():这是OpenCV中用于在图像上绘制文本的函数。
参数解析:
img:这是目标图像数组,文本将绘制在这个图像上。在本代码中,这个图像是之前创建的512x512像素的空图像,并且已经用其他绘制函数添加了图形。
'opencv Hello World!':这是要绘制的文本内容。在这个例子中,文本为“opencv Hello World!”。
org=(200, 300):这个参数指定了文本的起始位置坐标(x, y)。(200, 300)表示文本的左下角将位于图像中的坐标(200, 300),即距离左边200像素、距离上边300像素的位置。
fontFace=cv2.FONT_HERSHEY_SIMPLEX:这个参数指定使用的字体类型。在本例中,选择了FONT_HERSHEY_SIMPLEX,这是OpenCV提供的一个简单的无衬线字体。
fontScale=0.8:这个参数指定字体的缩放因子。值0.8表示字体的大小是默认大小的0.8倍,调整这个参数可以改变文本的大小。
color=(128, 255, 0):这是文本的颜色,格式为BGR(蓝、绿、红)值。在这里,(128, 255, 0)表示一种亮绿色,含有中等的蓝色成分、较强的绿色成分和无红色成分。
thickness=1:这个参数指定文本的线宽,单位为像素。值1表示文本的边缘宽度为1个像素。
"""
cv2.putText(img, 'opencv Hello World!', org=(200, 300),
fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.8, color=(128, 255, 0), thickness=1)
cv2.imshow('img', img)
cv2.waitKey(0)
if __name__ == '__main__':
draw_img()
代码解析
- 创建空白图像:
img = np.zeros(shape=(512, 512, 3), dtype=np.uint8)
- 这行代码的作用是创建一个空的图像数组。
np.zeros(...)
:创建一个指定形状的数组并填充为零。shape=(512, 512, 3)
:创建一个512x512像素的空图像,颜色通道数为3(BGR)。dtype=np.uint8
:数组中元素的数据类型为无符号8位整数,取值范围是0到255,适合表示RGB颜色值。- 这行代码用于创建一个512x512像素的空图像,初始颜色为黑色(因为所有的像素值都被初始化为0)。
- 打印图像形状:
print(img.shape)
img.shape
返回图像的形状信息,即高度、宽度和颜色通道数。
- 绘制一条红色直线:
cv2.line(img, pt1=(10, 10), pt2=(100, 200), color=(0, 0, 255), thickness=3)
cv2.line()
用于在图像上绘制一条直线。pt1=(10, 10)
:直线起点坐标。pt2=(100, 200)
:直线终点坐标。color=(0, 0, 255)
:直线的颜色为红色。thickness=3
:直线的宽度为3个像素。
- 绘制一条橙色水平线:
cv2.line(img, pt1=(0, 300), pt2=(img.shape[1], 300), color=(0, 128, 255), thickness=1)
pt2=(img.shape[1], 300)
:水平线终点坐标,img.shape[1]
返回图像的宽度(512)。
- 绘制一个蓝色填充矩形:
cv2.rectangle(img, pt1=(200, 100), pt2=(img.shape[1], 200), color=(255, 0, 0), thickness=cv2.FILLED)
cv2.rectangle()
用于在图像上绘制矩形。thickness=cv2.FILLED
:矩形将被填充为指定颜色。
- 绘制一个黄色圆圈:
cv2.circle(img, center=(50, 250), radius=30, color=(255, 255, 0), thickness=1)
cv2.circle()
用于在图像上绘制圆圈。center=(50, 250)
:圆心坐标。radius=30
:圆的半径为30像素。color=(255, 255, 0)
:圆的颜色为黄色。thickness=1
:圆的线宽为1个像素。
- 在图像上绘制文本:
cv2.putText(img, 'opencv Hello World!', org=(200, 300),
fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.8, color=(128, 255, 0), thickness=1)
cv2.putText()
用于在图像上绘制文本。org=(200, 300)
:文本的起始位置坐标。fontFace=cv2.FONT_HERSHEY_SIMPLEX
:使用的字体类型。fontScale=0.8
:字体的缩放因子。color=(128, 255, 0)
:文本的颜色为亮绿色。thickness=1
:文本的线宽为1个像素。
- 显示图像:
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.imshow()
用于显示图像。cv2.waitKey(0)
使窗口等待按键事件。
总结
本文详细介绍了如何使用 OpenCV 在 Python 中绘制基本图形,并通过具体的代码示例展示了整个过程。通过使用 OpenCV 库中的 cv2.line()
、cv2.rectangle()
、cv2.circle()
和 cv2.putText()
函数,我们可以轻松地在图像上绘制直线、矩形、圆圈和文本。