点赞 + 关注 + 收藏 = 学会了

推荐 《OpenCV-Python专栏》

使用 OpenCV 做目标检查时,我们可以通过 OpenCV 提供的图形绘制功能,将监测到的目标框起来,方便我们调试。这些功能在数据可视化、图像标注等场景中非常实用。

OpenCV 支持绘制以下图形:

  • 线段
  • 矩形
  • 圆形
  • 椭圆
  • 多边形
  • 填充多边形
  • 带箭头的线

用法都很简单,动手试试~

绘制线段

绘制线段的方法叫 cv2.line()

可传以下参数

cv2.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
  • img: 要绘制直线的目标图像。
  • pt1: 起点坐标。
  • pt2: 终点坐标。
  • color: 线条颜色((B, G, R) 格式)。
  • thickness: 线条宽度(默认 1,负值无效)。
  • lineType: 线条类型(cv2.LINE_8 默认)。

    • cv2.LINE_8(默认值):8-connected 线条(像素完全连接)。
    • cv2.LINE_4:4-connected 线条(像素部分连接)。
    • cv2.LINE_AA:抗锯齿线条(平滑效果更好)。
  • shift: 坐标的小数点精度(用于处理亚像素坐标)。默认为 0,表示整数坐标。

01.png

import cv2
import numpy as np

# 创建空白图像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 绘制不同类型的线条
cv2.line(img, (50, 50), (200, 50), (255, 255, 255), 1)            # 白色线条,默认类型
cv2.line(img, (50, 100), (200, 100), (0, 255, 0), 30)          # 绿色线条,粗细为 30
cv2.line(img, (50, 150), (200, 150), (0, 0, 255), 30, cv2.LINE_AA)  # 红色抗锯齿线条

# 展示图片
cv2.imshow("Img", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

绘制矩形

绘制矩形的方法是 cv2.rectangle()

可传以下参数

cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
  • img: 要绘制矩形的目标图像。
  • pt1: 矩形的左上角顶点。
  • pt2: 矩形的右下角顶点。
  • color: 矩形边框或填充的颜色。
  • thickness: 矩形边框的宽度(像素)。值为负数时填充矩形。
  • lineType: 矩形边框类型(cv2.LINE_8 默认)。

    • cv2.LINE_8(默认值):8-connected 线条(像素完全连接)。
    • cv2.LINE_4:4-connected 线条(像素部分连接)。
    • cv2.LINE_AA:抗锯齿线条(平滑效果更好)。
  • shift: 坐标的小数点精度(用于处理亚像素坐标)。默认为 0,表示整数坐标。

02.png

import cv2
import numpy as np

# 创建空白图像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 绘制不同类型的矩形
cv2.rectangle(img, (50, 50), (150, 150), (255, 0, 0), 10)       # 蓝色矩形,边框宽度 3
cv2.rectangle(img, (200, 50), (300, 150), (0, 255, 0), -1)     # 绿色填充矩形
cv2.rectangle(img, (50, 200), (150, 300), (0, 0, 255), 10, cv2.LINE_AA)  # 红色抗锯齿矩形

# 显示图像
cv2.imshow('Img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制圆形

绘制圆形的方法叫 cv2.circle()

可传以下参数

cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
  • img: 要绘制圆形的目标图像。
  • center: 圆心坐标 (x, y)。
  • radius: 圆半径(像素)。
  • color: 圆形边框或填充的颜色。
  • thickness: 圆形边框的宽度(像素)。值为负数时填充圆形。
  • lineType: 圆形边框类型(cv2.LINE_8 默认)。

    • cv2.LINE_8(默认值):8-connected 线条(像素完全连接)。
    • cv2.LINE_4:4-connected 线条(像素部分连接)。
    • cv2.LINE_AA:抗锯齿线条(平滑效果更好)。
  • shift: 坐标的小数点精度(用于处理亚像素坐标)。默认为 0,表示整数坐标。

03.png

import cv2
import numpy as np

# 创建空白图像
img = np.zeros((400, 400, 3), dtype=np.uint8)
# 绘制不同类型的圆形
cv2.circle(img, (100, 100), 50, (255, 0, 0), 2)        # 蓝色圆形,边框宽度2
cv2.circle(img, (250, 100), 50, (0, 255, 0), -1)       # 绿色填充圆形
cv2.circle(img, (100, 250), 50, (0, 0, 255), 2, cv2.LINE_AA)  # 红色抗锯齿圆形

# 显示图像
cv2.imshow('Circles', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制椭圆

绘制椭圆的方法叫 cv2.ellipse()

可传以下参数

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
  • img: 要绘制椭圆的目标图像。
  • center: 椭圆中心 (x, y)。
  • axes: 长轴和短轴的半径 (major, minor)。
  • angle: 椭圆旋转角度(逆时针)。
  • startAngle: 起始角度(单位:度)。
  • endAngle: 终止角度(单位:度)。
  • color: 椭圆边框或填充的颜色。
  • thickness: 椭圆边框的宽度(像素)。值为负数时填充椭圆。
  • lineType: 椭圆边框类型(cv2.LINE_8 默认)。

    • cv2.LINE_8(默认值):8-connected 线条(像素完全连接)。
    • cv2.LINE_4:4-connected 线条(像素部分连接)。
    • cv2.LINE_AA:抗锯齿线条(平滑效果更好)。
  • shift: 坐标的小数点精度(用于处理亚像素坐标)。默认为 0,表示整数坐标。

04.png

import cv2
import numpy as np

# 创建空白图像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 绘制不同类型的椭圆
cv2.ellipse(img, (100, 100), (80, 40), 0, 0, 360, (255, 0, 0), 2)  # 蓝色椭圆,边框宽度2
cv2.ellipse(img, (250, 100), (40, 80), 45, 0, 360, (0, 255, 0), -1)  # 绿色填充椭圆,旋转45度
cv2.ellipse(img, (100, 250), (60, 30), 90, 0, 360, (0, 0, 255), 2, cv2.LINE_AA)  # 红色抗锯齿椭圆,旋转90度

# 绘制不闭合的椭圆(只绘制0-180度部分)
cv2.ellipse(img, (250, 250), (70, 35), 135, 0, 180, (255, 255, 0), 2)  # 黄色不闭合椭圆,旋转135度

# 显示图像
cv2.imshow('Ellipses', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制多边形

绘制一组多边形线条可以用 cv2.polylines() 方法。

可传以下参数

cv2.polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
  • img: 要绘制多边形的目标图像。
  • pts: 顶点列表(数组形式,例如 [[(x1, y1), (x2, y2), ...]])。
  • isClosed: 是否闭合多边形。
  • color: 多边形边框颜色。
  • thickness: 线条宽度。
  • lineType: 线条类型。
  • shift: 坐标小数点精度。

05.png

import cv2
import numpy as np

# 创建空白图像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 创建多边形顶点坐标
triangle = np.array([[100, 100], [50, 200], [150, 200]], np.int32)  # 三角形
pentagon = np.array([[100, 250], [50, 300], [75, 350], [125, 350], [150, 300]], np.int32)  # 五边形

# 绘制多边形
cv2.polylines(img, [triangle], True, (255, 0, 0), 2)  # 蓝色三角形轮廓
cv2.polylines(img, [pentagon], True, (0, 0, 255), 2, cv2.LINE_AA)  # 红色抗锯齿五边形轮廓

# 创建不闭合多边形的顶点坐标
open_polygon = np.array([[250, 250], [200, 300], [250, 350], [300, 300]], np.int32)  # 四边形
# 绘制不闭合的多边形 (isClosed=False)
cv2.polylines(img, [open_polygon], False, (0, 255, 0), 2)  # 绿色不闭合多边形


# 显示图像
cv2.imshow('Polygons', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制填充多边形

绘制一组多边形线条可以用 cv2.fillPoly() 方法。

可传以下参数

cv2.fillPoly(img, pts, color, lineType=None, shift=None, offset=None)
  • img: 要绘制多边形的目标图像。
  • pts: 顶点列表(数组形式,例如 [[(x1, y1), (x2, y2), ...]])。
  • color: 填充颜色。
  • lineType: 边界线条类型。
  • shift: 坐标小数点精度。
  • offset: 全局顶点偏移量 (x_offset, y_offset)。

06.png

import cv2
import numpy as np

# 创建空白图像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 创建多边形顶点坐标
triangle = np.array([[100, 100], [50, 200], [150, 200]], np.int32)  # 三角形
pentagon = np.array([[100, 250], [50, 300], [75, 350], [125, 350], [150, 300]], np.int32)  # 五边形

# 绘制填充多边形
cv2.fillPoly(img, [triangle], (255, 0, 0))  # 蓝色填充三角形
cv2.fillPoly(img, [pentagon], (0, 0, 255))  # 红色填充五边形

# 显示图像
cv2.imshow('Filled Polygons', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制带箭头的线

绘制带箭头的线可以用 cv2.arrowedLine()

可传以下参数

cv2.arrowedLine(img, pt1, pt2, color, thickness=None, lineType=None, shift=None, tipLength=None)
  • img: 要绘制图形的目标图像。
  • pt1: 箭头的起点。
  • pt2: 箭头的终点。
  • color: 箭头颜色。
  • thickness: 线条宽度。
  • lineType: 线条类型。
  • shift: 坐标小数点精度。
  • tipLength: 箭头尖端长度(0.0 到 1.0 之间)。

07.png

import cv2
import numpy as np

# 创建空白图像
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 绘制不同类型的箭头线
cv2.arrowedLine(img, (50, 50), (200, 50), (255, 0, 0), 2)  # 蓝色水平箭头线
cv2.arrowedLine(img, (50, 100), (200, 200), (0, 255, 0), 3)  # 绿色斜向箭头线
cv2.arrowedLine(img, (50, 250), (50, 350), (0, 0, 255), 2, cv2.LINE_AA, 0, 0.3)  # 红色垂直抗锯齿箭头线,箭头大小为0.3

# 显示图像
cv2.imshow('Arrowed Lines', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

点赞 + 关注 + 收藏 = 学会了


德育处主任
170 声望16 粉丝