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

cv2.drawContours中contour与[contour]参数差异的技术疑问

问题原因分析
  • cv2.drawContours()的第二个参数要求传入轮廓的列表/数组,而非单个轮廓对象。单个轮廓c本质是形状为(n,1,2)的numpy数组,存储轮廓上的所有点坐标。
  • 直接传c时,函数会将数组里的每个点视为独立的1像素小轮廓。用cv2.FILLED填充时,单个点无法形成闭合区域,自然看不到填充效果;而线宽设为10时,每个点会被绘制为10像素的圆点,这些圆点连起来视觉上类似粗轮廓,导致你误以为正常工作。
  • 传[c]时,函数会把它识别为一个完整的闭合轮廓,填充逻辑能正确识别闭合区域,因此正常生效。
正确编码方式

遍历轮廓时,必须将单个轮廓包装成列表传入drawContours,示例代码如下:

import cv2
import numpy as np

# 图像预处理(示例流程)
img = cv2.imread("your_image_path.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cnts, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 创建用于绘制轮廓的画布
contour_img = np.zeros_like(img)

# 遍历并填充每个轮廓
for c in cnts:
    # 核心:将单个轮廓c包装为列表传入
    cv2.drawContours(contour_img, [c], -1, (0, 0, 255), cv2.FILLED)

# 展示结果
cv2.imshow("Filled Contours", contour_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:52:37