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

