OpenCV(十五):绘制矩形和圆
绘制矩形
矩形绘制是通过遍历所有介于 pt1 和 pt2 坐标范围内的像素点,并根据 thickness 参数来决定是只修改边界像素(thickness > 0)还是修改所有内部像素(thickness = -1)。
cv2.rectangle(img, pt1, pt2, color, thickness, lineType)
参数解析:
| 参数名 | 类型 | 详细说明 | 关键点 |
|---|---|---|---|
img | numpy.ndarray | 目标图像(画布)。 | 绘图操作是直接修改此数组。 |
pt1 | tuple | 矩形左上角的坐标 (x, y)。 | 定义矩形起始点。 |
pt2 | tuple | 矩形右下角的坐标 (x, y)。 | 定义矩形结束点。 |
color | tuple | 矩形的颜色,使用 BGR 格式。 | e.g., 纯红色是 (0, 0, 255)。 |
thickness | int | 边框线条的像素粗细。 | 设为 -1 或 cv2.FILLED 表示填充整个矩形。 |
lineType | int | 线条类型,默认 cv2.LINE_8。 | 推荐使用 cv2.LINE_AA(抗锯齿)。 |
绘制圆形
圆形绘制基于圆的标准方程。函数会计算所有到圆心距离等于半径的像素点,并根据 thickness 确定要修改的像素范围。
cv2.circle(img, center, radius, color, thickness, lineType)
参数解析:
| 参数名 | 类型 | 详细说明 | 关键点 |
|---|---|---|---|
img | numpy.ndarray | 目标图像(画布)。 | |
center | tuple | 圆形的圆心坐标 (x, y)。 | |
radius | int | 圆形的半径像素值。 | 决定圆形的大小。 |
color | tuple | 圆形的颜色,使用 BGR 格式。 | |
thickness | int | 圆形边框的像素粗细。 | 设为 -1 或 cv2.FILLED 表示填充整个圆形。 |
lineType | int | 线条类型,默认 cv2.LINE_8。 | 推荐使用 cv2.LINE_AA(抗锯齿)。 |
抗锯齿与颜色
颜色格式 (BGR vs. RGB)
OpenCV-Python 在读取图像时,默认的通道顺序是 B (Blue), G (Green), R (Red)。因此,当我们想要定义颜色时,必须使用 BGR 格式的元组:
- 纯蓝:
(255, 0, 0) - 纯绿:
(0, 255, 0) - 纯红:
(0, 0, 255) - 纯白:
(255, 255, 255) - 纯黑:
(0, 0, 0)
抗锯齿 (Anti-Aliasing)
当线条或曲线以较小的角度绘制时,容易出现阶梯状的边缘,这被称为“锯齿效应” (Aliasing)。
cv2.LINE_8(默认): 普通连接,会产生锯齿。cv2.LINE_AA(Anti-Aliasing): 使用抗锯齿算法,通过平滑边界像素的颜色过渡来消除锯齿,使边缘看起来更平滑、自然。在要求高质量显示的场景中强烈推荐使用。
示例
import cv2
import numpy as np# --- 1. 准备画布 ---
H, W = 600, 800
img = np.zeros((H, W, 3), dtype=np.uint8)
# 背景设为中灰色
img[:, :] = (100, 100, 100) # --- 2. 绘制矩形 (cv2.rectangle) ---# 2.1 绘制红色粗边框矩形
pt1_r = (50, 50)
pt2_r = (250, 200)
color_r = (0, 0, 255) # 红色 (BGR)
cv2.rectangle(img, pt1_r, pt2_r, color_r, thickness=6, lineType=cv2.LINE_AA)
# 在矩形旁标注文字
cv2.putText(img, "Red Outline (AA)", (50, 230), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_r, 2)# 2.2 绘制绿色填充矩形 (模拟标注框)
pt1_g = (300, 300)
pt2_g = (600, 500)
color_g = (0, 255, 0) # 绿色 (BGR)
cv2.rectangle(img, pt1_g, pt2_g, color_g, thickness=-1)
cv2.putText(img, "Green Filled", (300, 530), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_g, 2)# --- 3. 绘制圆形 (cv2.circle) ---# 3.1 绘制黄色抗锯齿圆形边框
center_y = (700, 100)
radius_y = 70
color_y = (0, 255, 255) # 黄色 (BGR)
cv2.circle(img, center_y, radius_y, color_y, thickness=4, lineType=cv2.LINE_AA)
cv2.putText(img, "Yellow Circle (AA)", (620, 200), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_y, 2)# 3.2 绘制品红色填充圆形 (无抗锯齿,对比效果)
center_m = (150, 450)
radius_m = 90
color_m = (255, 0, 255) # 品红色 (BGR)
cv2.circle(img, center_m, radius_m, color_m, thickness=-1, lineType=cv2.LINE_8)
cv2.putText(img, "Magenta Filled", (80, 570), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_m, 2)# --- 4. 显示结果 ---
cv2.imshow("OpenCV Drawing Primitives (Rectangle & Circle)", img)
# 等待按键,0表示永远等待
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()# 可以选择保存结果
# cv2.imwrite("opencv_drawing_example.png", img)
