Python OpenCV中如何将多个检测边界框合并为单个边界框
颜色检测分散边界框合并问题
实现逻辑
基于Python+OpenCV编写颜色检测脚本,核心流程为识别指定HSV区间的目标颜色后,提取对应轮廓并绘制轮廓与边界框。
测试素材
原始输入图像

初始运行效果

存在问题
初始脚本运行后检测到大量独立轮廓,生成多个零散分布的边界框,需实现方法将同属一个检测目标的分散边界框合并为单个整体边界框。
初始实现代码
import cv2 import imutils import numpy as np image = cv2.imread("L00001.png") image = imutils.resize(image, width=800) hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) lower_bound = np.array([45, 150, 20]) upper_bound = np.array([75, 305, 255]) origMask = cv2.inRange(hsv, lower_bound, upper_bound) contours, h = cv2.findContours(origMask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: new = np.vstack(contours) area = cv2.contourArea(c) if area > 10: x, y, w, h = cv2.boundingRect(c) cv2.rectangle(image, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2) cv2.imshow("FRAME", image) cv2.waitKey(0) cv2.destroyAllWindows()
可行实现方案
两种无额外依赖的实现方式,可按需选择:
- 形态学操作预处理掩码:零散轮廓多由颜色区域噪点、内部空洞导致,提取轮廓前先对颜色掩码做膨胀+闭运算,将邻近同色区域连通为整体,后续提取轮廓即可直接得到整块目标的外轮廓。
核心操作片段:# 生成origMask后新增形态学处理逻辑 kernel = np.ones((5,5), np.uint8) # 闭运算填充区域内小空洞,膨胀操作连通邻近分散色块 processed_mask = cv2.morphologyEx(origMask, cv2.MORPH_CLOSE, kernel, iterations=2) processed_mask = cv2.dilate(processed_mask, kernel, iterations=3) # 后续轮廓查找环节使用processed_mask替代原始origMask即可 - 直接合并有效轮廓的边界坐标:如果不需要修改掩码,可在遍历所有符合面积阈值的有效轮廓时,实时记录全局最小x、最小y、最大x、最大y四个边界值,遍历完成后直接用四个值绘制整体边界框。
核心修改片段:# 初始化全局边界极值 min_x, min_y = image.shape[1], image.shape[0] max_x = max_y = 0 for c in contours: area = cv2.contourArea(c) if area > 10: x, y, w, h = cv2.boundingRect(c) # 更新全局边界极值 min_x = min(min_x, x) min_y = min(min_y, y) max_x = max(max_x, x + w) max_y = max(max_y, y + h) # 所有轮廓遍历完成后,绘制单个整体边界框 cv2.rectangle(image, (min_x, min_y), (max_x, max_y), (0, 0, 255), 2)
提示:原代码循环内的
new = np.vstack(contours)属于无效冗余代码,每次循环都会重复拼接全量轮廓,会额外拖慢运行速度,可直接删除。
内容的提问来源于stack exchange,提问作者S Andrew
相关产品推荐
相关产品推荐

