OpenCV fillPoly详解

一、fillPoly的基本概念

fillPoly是OpenCV库中的一个函数,用于在图像上绘制一个填充的多边形。它的语法如下:

cv2.fillPoly(img, pts, color[, lineType[, shift[, offset]]])

参数解释:

  • img: 需要被绘制的图像
  • pts: 需要绘制的多边形各个定点的坐标数组,数据类型为numpy.int32,大小为 [npts, 1, 2]
  • color: 绘制的颜色,可以为单个BGR值或BGR数组
  • lineType: 多边形的线条类型,默认为cv2.LINE_8
  • shift: 绘制精度,默认为0(单精度)
  • offset: 绘制的偏移量,默认为(0,0)

二、fillPoly常用参数详解

1. 多边形的顶点坐标数组

pts是表示多边形各个定点的坐标数组,它的数据类型为numpy.int32,大小为[npts, 1, 2]。其中npts代表多边形的顶点数,1代表维度,2代表x和y坐标。

代码示例:

import numpy as np
import cv2

# 定义多边形的顶点坐标数组
pts = np.array([[(200, 150), (300, 50), (400, 150), (300, 250)]], dtype=np.int32)

# 创建一个黑色图像
img = np.zeros((512, 512, 3), dtype=np.uint8)

# 绘制多边形
cv2.fillPoly(img, pts, (0, 255, 0))

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

2. 绘制多个多边形

可以通过传入多个pts数组,实现绘制多个多边形,如下所示:

# 定义两个多边形顶点坐标数组
pts1 = np.array([[(200, 150), (300, 50), (400, 150), (300, 250)]], dtype=np.int32)
pts2 = np.array([[(120, 240), (190, 240), (190, 310), (120, 310)],
                 [(240, 240), (310, 240), (310, 310), (240, 310)]], dtype=np.int32)

# 创建一个黑色图像
img = np.zeros((512, 512, 3), dtype=np.uint8)

# 绘制多边形
cv2.fillPoly(img, [pts1, pts2], (0, 255, 0))

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

3. 绘制填充有孔的多边形

对于具有镂空效果的多边形,需要绘制多个多边形。内部的多边形使用相反的方向绘制,在绘制时,需要在outer的pts数组之前添加inner的pts数组。

代码示例:

# 定义多个多边形顶点坐标数组,后面的内部多边形需要绘制相反的方向
pts1 = np.array([[(200, 150), (300, 50), (400, 150), (300, 250)]], dtype=np.int32)
pts2 = np.array([[(120, 240), (190, 240), (190, 310), (120, 310)],
                 [(240, 240), (310, 240), (310, 310), (240, 310)]], dtype=np.int32)

# 创建一个黑色图像
img = np.zeros((512, 512, 3), dtype=np.uint8)

# 绘制多边形
cv2.fillPoly(img, [pts1, pts2], (0, 255, 0))

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

三、fillPoly实例应用

1. 绘制有界区域

可以使用fillPoly函数绘制一个由直线和弧线围成的有界区域,如下所示:

# 创建一张黑色的图像
img = np.zeros((300, 300, 3), dtype=np.uint8)

# 画整个图形,以便用lineType参数画出虚线
pts = np.array([[(151, 71), (253, 63), (282, 126), (240, 245), (102, 245), (60, 126)]], dtype=np.int32)
cv2.fillPoly(img, pts, (255, 255, 255))

# 绘制虚线
pts = np.array([[(151, 71), (253, 63), (282, 126), (240, 245), (102, 245), (60, 126)],
                [(120, 189), (180, 192)],
                [(118, 211), (182, 209)],
                [(244, 205), (262, 213), (276, 226)],
                [(114, 170), (162, 167), (163, 171), (138, 176)], 
                [(162, 167), (179, 168), (181, 172), (163, 171)],
                [(139, 151), (186, 157), (170, 164)],
                [(186, 157), (214, 196), (202, 203), (170, 164)],
                [(109, 217), (79, 255), (80, 227)],
                [(78, 254), (158, 207), (152, 224), (80, 227)],
                [(241, 194), (221, 253), (248, 218)],
                [(222, 251), (241, 194), (254, 214)]])

for i in range(0, pts.shape[0]):
    cv2.polylines(img, [pts[i]], isClosed=True, color=(255, 0, 0), thickness=2, lineType=cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 生成随机多边形

可以使用fillPoly函数生成随机多边形。首先生成随机多边形的顶点数和点坐标,然后绘制多边形。

代码示例:

import random

# 随机生成多边形顶点数目和坐标
npts = random.randint(3, 10)
pts = [(random.randint(50, 200), random.randint(50, 200)) for i in range(npts)]
pts_array = np.array([pts], np.int32)

# 创建一个黑色图像
img = np.zeros((300, 300, 3), dtype=np.uint8)

# 绘制多边形
cv2.fillPoly(img, [pts_array], (0, 255, 0))

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

3. 二值图像中绘制多边形

可以使用fillPoly将多边形绘制在二值图像上。

代码示例:

# 读取一张灰度图
img = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE)

# 二值化图像
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

# 找到轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 创建一张黑色图像
h, w = img.shape
img = np.zeros((h, w, 3), dtype=np.uint8)

# 绘制轮廓
for i in range(len(contours)):
    color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    cv2.fillPoly(img, pts=[contours[i]], color=color)

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

原创文章,作者:PUHW,如若转载,请注明出处:https://www.506064.com/n/136729.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PUHWPUHW
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相关推荐

  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python OpenCV 直线检测

    本文将介绍在Python OpenCV中进行直线检测的方法,主要涉及到图像的边缘检测、霍夫变换和绘制直线等操作。 一、边缘检测 由于直线检测是从图像的边缘开始的,因此必须先找到图像…

    编程 2025-04-29
  • Opencv 实现读取 BMP 图片

    Opencv 是一个基于 C/C++ 语言的开源计算机视觉库,可以用于图像处理、特征识别、目标跟踪、机器学习等领域。在图像处理中,读取 BMP 图片是常见操作之一。 一、打开 BM…

    编程 2025-04-27
  • opencv鼠标绘图

    本文将为您详细介绍如何使用opencv在原始图片上进行鼠标绘图。 一、准备工作 在开始绘制之前,您需要先准备好以下的工作: 1、安装opencv库,可以通过pip install …

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25

发表回复

登录后才能评论