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

OpenCV Python形状检测:分割图像中两个矩形并提取坐标

Hey, 看你的问题描述,现在轮廓检测把整个图像识别成圆形,没法分割出两个矩形还得去除多余凸起——这情况我之前调试时也碰到过,大概率是阈值处理没精准分离两个矩形,或者轮廓检测的参数没适配需求。给你一套针对性的调整方案,一步步来:

1. 先优化阈值处理,把两个矩形彻底分开

你当前用的固定阈值(60)可能太宽松,导致两个矩形之间的区域也被填充成前景,直接连在一起了。换成自适应阈值试试,它能根据局部区域的亮度调整阈值,避免整体阈值的一刀切问题:

# 替换你原来的thresh生成代码
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)  # 把高斯核从5x5改成3x3,避免过度模糊边界
# 如果你的矩形是浅色、背景深色,用THRESH_BINARY;反之用THRESH_BINARY_INV
thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                               cv2.THRESH_BINARY_INV, 11, 2)
2. 用形态学操作去除多余凸起

接下来用开运算先去掉小的凸起和噪点,再用闭运算修复矩形边缘的小缺口,让轮廓更规整:

# 创建3x3的矩形结构元素,适配矩形轮廓的修复
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 开运算:先腐蚀再膨胀,干掉小凸起
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
# 闭运算:先膨胀再腐蚀,修复矩形边缘的小缺口
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
3. 调整轮廓检测参数,精准定位矩形

你原来用的cv2.RETR_LIST会检索所有轮廓,容易混入干扰;换成cv2.RETR_EXTERNAL只找最外层轮廓,再配合轮廓近似筛选出矩形:

# 替换轮廓检测代码
cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 遍历轮廓,筛选出矩形并提取坐标
for cnt in cnts:
    # 计算轮廓周长,用于后续的近似精度
    perimeter = cv2.arcLength(cnt, True)
    # 近似轮廓,epsilon设为周长的2%,这个值可以根据你的图像微调
    approx = cv2.approxPolyDP(cnt, 0.02 * perimeter, True)
    # 矩形的近似轮廓应该有4个顶点
    if len(approx) == 4:
        # 获取矩形的边界坐标(x,y是左上角,w是宽度,h是高度)
        x, y, w, h = cv2.boundingRect(approx)
        print(f"检测到矩形:左上角({x}, {y}),宽度{w},高度{h}")
        # 可选:在原图上画出矩形,方便调试
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
额外调试小贴士
  • 如果图像是黑白倒置的(比如矩形是黑色、背景白色),记得把THRESH_BINARY_INV改成THRESH_BINARY
  • 如果还是有干扰轮廓,可以加一步面积筛选:计算轮廓面积cv2.contourArea(cnt),只保留面积在合理范围内的轮廓

把这些代码替换到你原来的detect_shapes.py里,应该就能顺利分割出两个矩形,提取坐标,同时去掉多余凸起了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:51:32