如何在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
相关产品推荐
相关产品推荐

