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

使用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()

关键优化点

  1. 颜色提取优化:改用HSV颜色空间提取红色掩码,比直接灰度化更精准,避免背景干扰
  2. 轮廓检索模式:使用cv2.RETR_EXTERNAL仅提取最外层轮廓,避免填充内部无关小轮廓
  3. 版本兼容:采用OpenCV 4.x+的标准写法,同时增加了图像读取失败的判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:45:31