You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenCV中使用fillPoly()绘制带孔洞的多边形?

用OpenCV的fillPoly()绘制带孔洞的多边形区域

要实现带孔洞的填充效果,核心是利用轮廓方向的差异让OpenCV区分外边界和孔洞,具体操作步骤如下:

  • 准备外轮廓和内轮廓的点集:外轮廓是要填充的主体区域边界,内轮廓就是孔洞的边界
  • 调整轮廓点的顺序:外轮廓和内轮廓的点排列方向必须相反(比如外轮廓用顺时针,内轮廓就用逆时针;反之亦然)
  • 将所有轮廓点集放到同一个数组中,传入fillPoly函数

代码示例

import cv2
import numpy as np

# 创建空白图像,背景设为黑色
img = np.zeros((500, 500, 3), dtype=np.uint8)

# 定义外轮廓(顺时针的正方形)
outer_contour = np.array([[100, 100], [400, 100], [400, 400], [100, 400]], dtype=np.int32)
# 定义内轮廓(逆时针的正方形,作为孔洞)
inner_contour = np.array([[200, 200], [200, 300], [300, 300], [300, 200]], dtype=np.int32)

# 将外轮廓和内轮廓放到同一个列表中
contours = [outer_contour, inner_contour]

# 调用fillPoly填充,颜色设为绿色
cv2.fillPoly(img, contours, (0, 255, 0))

# 显示结果
cv2.imshow("Hollow Polygon", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键注意事项

  • 所有轮廓点的 dtype 必须是 np.int32,否则fillPoly会报错
  • 如果需要多个孔洞,只需要把多个内轮廓都加入到contours列表中,每个内轮廓的点顺序都要和外轮廓相反
  • 轮廓点的顺序判断:可以用cv2.contourArea()函数,返回值为正代表顺时针(默认),负代表逆时针;也可以手动调整点的排列顺序

内容的提问来源于stack exchange,提问作者stargirl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:45:45