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

OpenCV:如何为检测到的相邻轮廓矩形添加统一外接大矩形

实现方案

你可以通过「先合并相邻矩形区域再重新找外接矩形」的思路实现,具体步骤和代码如下:

步骤说明

  • 第一步:先过滤出所有符合面积要求的轮廓,把它们的外接矩形统一存到列表里
  • 第二步:新建一个和原图尺寸一致的单通道空白掩膜,把所有上一步得到的小矩形都用白色填充画在掩膜上,位置相邻的矩形会自动合并成连通的大块区域
  • 第三步:对这个掩膜重新做轮廓检测,得到的每一个轮廓对应的外接矩形,就是覆盖相邻小矩形的大外接矩形
  • 第四步:把得到的大矩形画到原图上即可

代码示例

import cv2
import numpy as np

# 原有逻辑,先拿到所有符合要求的小矩形
img = cv2.imread("你的原始图片路径")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
contours = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]

# 存储所有符合要求的小矩形
rect_list = []
for c in contours:
    area = cv2.contourArea(c)
    if area > 500:
        x,y,w,h = cv2.boundingRect(c)
        rect_list.append((x,y,w,h))
        # 原有画小矩形和填充轮廓的逻辑可以保留
        cv2.rectangle(img, (x, y), (x + w, y + h), (36,255,12), 2)
        cv2.drawContours(img, [c], 0, (0,255,0), -1)

# 新建空白掩膜,合并相邻矩形
mask = np.zeros(img.shape[:2], dtype=np.uint8)
for (x,y,w,h) in rect_list:
    # 把小矩形填充到掩膜,相邻的会自动连成片
    cv2.rectangle(mask, (x,y), (x+w, y+h), 255, -1)

# 对合并后的掩膜找轮廓,得到大矩形
merged_contours = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
merged_contours = merged_contours[0] if len(merged_contours) == 2 else merged_contours[1]
for mc in merged_contours:
    mx,my,mw,mh = cv2.boundingRect(mc)
    # 画大外接矩形,颜色可自行调整
    cv2.rectangle(img, (mx, my), (mx + mw, my + mh), (0,0,255), 3)

# 展示/保存结果
cv2.imshow("result", img)
cv2.waitKey(0)

可选优化

如果需要调整「相邻」的判断阈值,比如允许两个矩形间隔几个像素也算相邻,可以在画完掩膜之后加一步形态学膨胀操作:

# 3x3的卷积核,膨胀2个像素,间隔2像素以内的矩形都会被合并
kernel = np.ones((3,3), np.uint8)
mask = cv2.dilate(mask, kernel, iterations=2)

调整迭代次数或者卷积核大小,就能灵活控制合并的宽松程度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:09:04