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

OpenCV如何绘制无填充轮廓?解决数字提取的填充问题

解决OpenCV绘制数字轮廓时填充内部封闭区域的问题

针对0、8这类带封闭区域的数字,使用cv.FILLED填充轮廓会导致内部被填满的问题,你可以通过以下两种方法解决:

方法1:直接绘制轮廓线条而非填充

放弃使用cv.FILLED,改为设置合适的thickness参数(数值根据图像尺寸调整,比如2或3),这样只会绘制轮廓的边缘线条,不会填充内部区域:

cv.drawContours(black_img, [contour_num], -1, (255, 255, 255), thickness=2)

方法2:利用轮廓层级区分内外轮廓,实现空心填充

如果需要保留填充后的数字形状但挖空内部封闭区域,可以通过轮廓层级(hierarchy)筛选外轮廓和内轮廓,先填充外轮廓为白色,再用黑色填充内轮廓:

  1. 查找轮廓时指定cv.RETR_CCOMP模式以获取完整的层级信息:
contours, hierarchy = cv.findContours(gray_img, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
  1. 遍历轮廓并根据层级判断类型,分别处理:
black_img = np.zeros_like(gray_img)
for idx, contour in enumerate(contours):
    # hierarchy[0][idx][3] == -1 表示当前是外轮廓
    if hierarchy[0][idx][3] == -1:
        cv.drawContours(black_img, [contour], 0, 255, cv.FILLED)
    # 否则是内轮廓,用黑色填充挖空
    else:
        cv.drawContours(black_img, [contour], 0, 0, cv.FILLED)

这个方法会让0、8这类数字保留原本的空心结构,不会变成实心块。

内容的提问来源于stack exchange,提问作者David Pileček

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:50:27