使用OpenCV填充多边形轮廓遇报错问题求助
问题解决:OpenCV填充红色多边形轮廓报错及优化方案
错误原因
你遇到的ValueError: not enough values to unpack (expected 3, got 2)是因为OpenCV版本差异导致的返回值数量不同:
- OpenCV 3.x及更早版本中,
cv2.findContours()返回3个值:二值图像、轮廓列表、层级信息 - OpenCV 4.x及以上版本中,该函数仅返回2个值:轮廓列表(contours)、层级信息(hierarchy)
你的代码用3个变量接收返回值,在4.x+版本中自然会报错。
修正及优化后的代码
考虑到你的需求是填充黑色背景上的红色多边形轮廓,直接灰度化可能无法精准区分红色与背景,这里改用HSV颜色空间提取红色掩码,再查找轮廓填充,效果更可靠:
import cv2 # 读取图像,先检查路径是否正确 image = cv2.imread("image_to_read.jpg") if image is None: print("无法读取图像,请确认文件路径正确") exit() # 转换到HSV颜色空间,便于精准提取红色区域 hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义红色的HSV范围(红色在HSV中有两个区间) lower_red1 = (0, 120, 70) upper_red1 = (10, 255, 255) lower_red2 = (170, 120, 70) upper_red2 = (180, 255, 255) # 生成红色区域的掩码 mask1 = cv2.inRange(hsv_image, lower_red1, upper_red1) mask2 = cv2.inRange(hsv_image, lower_red2, upper_red2) red_mask = mask1 | mask2 # 查找轮廓(OpenCV 4.x+写法,仅接收两个返回值) contours, hierarchy = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓并填充(这里用红色填充,可根据需求修改颜色值) for contour in contours: cv2.drawContours(image, [contour], 0, (0, 0, 255), -1) # 显示结果 cv2.imshow("Filled Image", image) cv2.waitKey(0) cv2.destroyAllWindows()
关键优化点
- 颜色提取优化:改用HSV颜色空间提取红色掩码,比直接灰度化更精准,避免背景干扰
- 轮廓检索模式:使用
cv2.RETR_EXTERNAL仅提取最外层轮廓,避免填充内部无关小轮廓 - 版本兼容:采用OpenCV 4.x+的标准写法,同时增加了图像读取失败的判断
内容的提问来源于stack exchange,提问作者OlegRuskiy
相关产品推荐
相关产品推荐

