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

基于OpenCV(Python)在边缘检测图像中检测椭圆与矩形的技术咨询

OpenCV检测边缘图像中的矩形与椭圆实现方案

需求背景

需判断场景中是否存在类矩形物体:物体存在时边缘检测结果为矩形轮廓,移除后则为椭圆轮廓。已完成步骤:

  • 加载图像
  • 应用Canny边缘检测提取边缘
  • 得到二值边缘检测图像

需实现目标:在边缘图像中检测并标记椭圆与矩形,绘制对应边界框/椭圆轮廓,获取其坐标、尺寸及角度等参数。


针对疑问的解答

1. 检测椭圆的OpenCV函数

核心使用cv2.fitEllipse(),但需结合轮廓检测流程:

  • 先用cv2.findContours()从二值边缘图中提取轮廓
  • 筛选出点数量≥5的轮廓(椭圆拟合的最低要求)
  • 对符合条件的轮廓调用cv2.fitEllipse()完成椭圆拟合

2. 绘制检测到的形状

绘制矩形

  • 旋转矩形:用cv2.minAreaRect()得到矩形参数,再通过cv2.boxPoints()转换为顶点坐标,最后用cv2.drawContours()绘制
  • 轴对齐矩形:直接用cv2.rectangle(),传入左上角和右下角坐标即可

绘制椭圆

直接调用cv2.ellipse(),传入cv2.fitEllipse()返回的椭圆参数(中心、长短轴、旋转角度)即可绘制轮廓。

3. 获取形状参数信息

矩形参数

  • 旋转矩形:cv2.minAreaRect()返回((cx, cy), (w, h), angle),其中(cx, cy)是中心坐标,w/h为宽高,angle是旋转角度(逆时针)
  • 轴对齐矩形:cv2.boundingRect()返回(x, y, w, h),(x,y)是左上角坐标,w/h为宽高

椭圆参数

cv2.fitEllipse()返回((cx, cy), (major_axis, minor_axis), angle),其中(cx, cy)是中心坐标,major_axis/minor_axis为长/短轴长度,angle是长轴与水平轴的逆时针夹角。


完整代码示例

import cv2
import numpy as np

def detect_and_mark_shapes(edge_img):
    # 提取外部轮廓
    contours, _ = cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 转为彩色图用于绘制标记
    result_img = cv2.cvtColor(edge_img, cv2.COLOR_GRAY2BGR)
    
    for cnt in contours:
        # 过滤过小的噪点轮廓
        if cv2.contourArea(cnt) < 100:
            continue
        
        # 多边形近似判断是否为矩形
        approx = cv2.approxPolyDP(cnt, 0.02 * cv2.arcLength(cnt, True), True)
        if len(approx) == 4:
            # 获取并绘制旋转矩形
            rect = cv2.minAreaRect(cnt)
            box = np.int0(cv2.boxPoints(rect))
            cv2.drawContours(result_img, [box], 0, (0, 255, 0), 2)
            # 输出矩形参数
            cx, cy = rect[0]
            w, h = rect[1]
            angle = rect[2]
            print(f"矩形:中心({cx:.2f}, {cy:.2f}),尺寸({w:.2f}, {h:.2f}),旋转角度{angle:.2f}°")
        else:
            # 拟合椭圆(需至少5个轮廓点)
            if len(cnt) >= 5:
                ellipse = cv2.fitEllipse(cnt)
                cv2.ellipse(result_img, ellipse, (0, 0, 255), 2)
                # 输出椭圆参数
                cx, cy = ellipse[0]
                major, minor = ellipse[1]
                angle = ellipse[2]
                print(f"椭圆:中心({cx:.2f}, {cy:.2f}),长短轴({major:.2f}, {minor:.2f}),旋转角度{angle:.2f}°")
    
    return result_img

# 加载边缘图像(替换为你的图像路径)
rect_edge = cv2.imread("rect_edge.jpg", cv2.IMREAD_GRAYSCALE)
ellipse_edge = cv2.imread("ellipse_edge.jpg", cv2.IMREAD_GRAYSCALE)

# 执行检测与标记
rect_result = detect_and_mark_shapes(rect_edge)
ellipse_result = detect_and_mark_shapes(ellipse_edge)

# 显示结果
cv2.imshow("标记矩形", rect_result)
cv2.imshow("标记椭圆", ellipse_result)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意事项

  • 轮廓面积阈值(100)需根据实际图像尺寸调整,避免误检噪点
  • 多边形近似的精度参数(0.02 * cv2.arcLength(...))可微调,确保准确识别矩形的4条边
  • 椭圆拟合必须满足轮廓点数量≥5,否则会抛出异常,需提前判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:24:54