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

