OpenCV-Python快速入门系列16多边形填充与绘制

前言

在计算机视觉任务中,绘制和填充多边形是基本技能,例如用于物体标注或区域分割的可视化。OpenCV 提供了多种方法实现多边形绘制和填充,其中包括 cv.polylinescv.fillPolycv.drawContours 等。本文通过一个示例讲解如何灵活地绘制和填充多边形。

完整代码

import cv2 as cv
import numpy as np

def polyline_draw_demo():
    # 创建一个黑色画布
    image = np.zeros((512, 512, 3), dtype=np.uint8)

    # 定义多边形顶点
    pts = np.array([[100, 100], [350, 100], [450, 280], [320, 450], [80, 400]], dtype=np.int32)

    # 方法1:使用 cv.polylines 绘制多边形边框
    # cv.polylines(image, [pts], isClosed=True, color=(0, 0, 255), thickness=2)

    # 方法2:使用 cv.fillPoly 填充多边形
    # cv.fillPoly(image, [pts], (255, 0, 255))

    # 方法3:使用 cv.drawContours 绘制多边形边框
    cv.drawContours(image, [pts], contourIdx=-1, color=(0, 255, 0), thickness=1)

    # 方法4:使用 cv.drawContours 填充多边形边框并且填充
    cv.drawContours(image, [pts], contourIdx=-1, color=(0, 255, 0), thickness=-1)

    # 显示结果
    cv.imshow("Polyline", image)
    cv.waitKey(0)
    cv.destroyAllWindows()

# 调用函数
polyline_draw_demo()

代码详解

方法1:cv.polylines

用于绘制多边形的边框:

cv.polylines(image, [pts], isClosed=True, color=(0, 0, 255), thickness=2)
  • 参数说明
    • image: 绘制的目标图像。
    • [pts]: 多边形顶点列表,必须用方括号包裹。
    • isClosed=True: 指定是否闭合多边形。
    • color=(0, 0, 255): 边框颜色,BGR 格式,这里是红色。
    • thickness=2: 边框的线宽。

方法2:cv.fillPoly

用于填充多边形区域:

cv.fillPoly(image, [pts], (255, 0, 255))
  • 参数说明
    • image: 绘制的目标图像。
    • [pts]: 多边形顶点列表,必须用方括号包裹。
    • (255, 0, 255): 填充颜色,BGR 格式,这里是紫色。

方法3和4:cv.drawContours

用于绘制或填充多边形:

cv.drawContours(image, [pts], contourIdx=-1, color=(0, 255, 0), thickness=1)
cv.drawContours(image, [pts], contourIdx=-1, color=(0, 255, 0), thickness=-1)
  • 参数说明
    • image: 绘制的目标图像。
    • [pts]: 多边形顶点列表,必须用方括号包裹。
    • contourIdx=-1: 表示绘制所有轮廓,单一轮廓也用 -1。
    • color=(0, 255, 0): 绘制颜色,BGR 格式,这里是绿色。
    • thickness=1: 边框线宽,thickness=-1 表示填充区域。

不同方法的优缺点分析

方法1:cv.polylines

  • 优点
    • 语义明确,专用于绘制多边形的边框。
    • 提供 isClosed 参数,方便绘制非闭合多边形。
  • 缺点
    • 仅能绘制边框,不能直接填充区域。

方法2:cv.fillPoly

  • 优点
    • 高效填充多边形区域。
    • 简单直接,适合需要填充区域的场景。
  • 缺点
    • 无法绘制边框,只能填充。

方法3和4:cv.drawContours

  • 优点
    • 功能灵活,既可以绘制边框,也可以填充区域。
    • 更适合复杂的形状(如嵌套轮廓、多重区域)。
  • 缺点
    • 参数较多,初学者可能不容易理解。
    • 如果只需要简单的边框或填充,用它可能显得冗余。
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容