概述
在图像处理和计算机视觉领域,OpenCV 是一个非常强大的工具包。它提供了许多函数来帮助开发者完成图像处理任务,包括绘制基本图形。本文将详细介绍如何使用 OpenCV 在 Python 中绘制基本图形,并通过具体的代码示例来展示整个过程。
环境准备
在开始之前,请确保已经安装了 OpenCV 库。如果没有安装,可以通过以下命令进行安装:
pip install opencv-python
示例代码详解
python">import cv2
import numpy as npdef 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)# 通道顺序为BGRprint(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()
代码解析
-
创建空白图像:
python">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)。
-
打印图像形状:
python">print(img.shape)
img.shape
返回图像的形状信息,即高度、宽度和颜色通道数。
-
绘制一条红色直线:
python">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个像素。
-
绘制一条橙色水平线:
python">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)。
-
绘制一个蓝色填充矩形:
python">cv2.rectangle(img, pt1=(200, 100), pt2=(img.shape[1], 200), color=(255, 0, 0), thickness=cv2.FILLED)
cv2.rectangle()
用于在图像上绘制矩形。thickness=cv2.FILLED
:矩形将被填充为指定颜色。
-
绘制一个黄色圆圈:
python">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个像素。
-
在图像上绘制文本:
python">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个像素。
-
显示图像:
python">cv2.imshow('img', img) cv2.waitKey(0)
cv2.imshow()
用于显示图像。cv2.waitKey(0)
使窗口等待按键事件。
总结
本文详细介绍了如何使用 OpenCV 在 Python 中绘制基本图形,并通过具体的代码示例展示了整个过程。通过使用 OpenCV 库中的 cv2.line()
、cv2.rectangle()
、cv2.circle()
和 cv2.putText()
函数,我们可以轻松地在图像上绘制直线、矩形、圆圈和文本。