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

使用OpenCV合并停车标志轮廓为单个外接矩形的技术求助

解决停车标志分散轮廓的外接矩形合并问题

我明白你现在的困扰——停车标志因为形状断裂被分成了好几个小轮廓,单独用boundingRect只能给每个碎块画框,根本拿不到整个标志的外接矩形用来裁剪。这里给你两个实用的解决思路,亲测有效:

方法一:用轮廓聚类合并边界框

核心思路是把距离近、属于同一个标志的小轮廓归为一组,然后计算这组轮廓的整体外接矩形。OpenCV自带的cv2.groupRectangles可以帮我们快速完成这个聚类合并:

import cv2
import numpy as np

image = cv2.imread(sign_directory)
# 红色区域掩码提取
lower = np.array([0, 0, 110])
upper = np.array([100, 100, 250])
shapeMask = cv2.inRange(image, lower, upper)
# 提取所有外部轮廓
(img, cnts, _) = cv2.findContours(shapeMask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 1. 收集所有小轮廓的边界框,转换为(x1,y1,x2,y2)格式
rects = []
for c in cnts:
    x, y, w, h = cv2.boundingRect(c)
    rects.append([x, y, x+w, y+h])

# 2. 合并重叠/邻近的矩形
# groupThreshold=1表示只要有矩形就可以成组,eps是允许的距离/重叠比例(0.2表示20%)
grouped_rects, weights = cv2.groupRectangles(rects, groupThreshold=1, eps=0.2)

# 3. 绘制合并后的大矩形
for rect in grouped_rects:
    x1, y1, x2, y2 = rect
    cv2.rectangle(image, (x1, y1), (x2, y2), (0,255,0), 2)

cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数调整提示:eps值可以根据你的图像灵活调整——如果标志的碎块离得远,就调大一点(比如0.3~0.5);如果有相邻标志被误合并,就调小一点(比如0.1)。

方法二:形态学膨胀填补断裂

如果你的标志断裂是因为缝隙比较小,我们可以先对红色掩码做膨胀操作,把分散的红色区域先连起来,再找轮廓就会得到完整的标志轮廓:

import cv2
import numpy as np

image = cv2.imread(sign_directory)
lower = np.array([0, 0, 110])
upper = np.array([100, 100, 250])
shapeMask = cv2.inRange(image, lower, upper)

# 1. 创建矩形结构元素,膨胀填补缝隙
# 核的大小根据断裂缝隙调整,比如缝隙大用(15,15),缝隙小用(5,5)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,10))
# 迭代2次让缝隙完全闭合
dilated_mask = cv2.dilate(shapeMask, kernel, iterations=2)

# 2. 在膨胀后的掩码上提取轮廓
(img, cnts, _) = cv2.findContours(dilated_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 3. 过滤小噪声轮廓,绘制外接矩形
for c in cnts:
    # 过滤面积太小的噪声(阈值根据你的图像尺寸调整)
    if cv2.contourArea(c) < 500:
        continue
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)

cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数调整提示:如果膨胀后把相邻的停车标志也合并了,就减小核的大小或者减少迭代次数;如果还有断裂没补上,就增大核或者增加迭代次数。

额外优化小技巧

如果你的停车标志是标准的八边形,可以在提取轮廓后用cv2.approxPolyDP拟合多边形,判断拟合后的边数是否为8,这样能精准过滤掉非停车标志的红色区域,进一步提升准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:01:38