OpenCV:外接矩形

发布于:2025-02-10 ⋅ 阅读:(49) ⋅ 点赞:(0)

目录

简述

1. 什么是外接矩形?

2. 直边矩形

2.1. 接口定义

3. 旋转矩形

3.1 接口定义

3.2 获取旋转矩形的顶点

 4. 代码示例

5. 应用场景

6. 注意事项


相关阅读

OpenCV:图像轮廓-CSDN博客

OpenCV:多边形逼近与凸包-CSDN博客


简述

在图像处理和计算机视觉中,外接矩形 是一种用于描述轮廓或目标区域最小矩形边界的技术。它在目标检测、目标跟踪以及图像裁剪等领域中有广泛的应用。本文将介绍外界矩形的概念、分类、相关接口及具体用例。


1. 什么是外接矩形?

外接矩形是指在二维平面上包围目标的最小矩形,它完全覆盖目标的所有像素。OpenCV 提供了两种外接矩形的计算方法:

直边矩形:

  • 矩形的边平行于图像的 X 和 Y 轴。
  • 矩形不旋转,覆盖目标时可能会包含多余的区域。

旋转矩形:

  • 矩形的边可以任意旋转,以最紧密地贴合目标。
  • 更适合于不规则或斜置的目标区域。

2. 直边矩形

2.1. 接口定义

OpenCV 提供了 cv2.boundingRect() 函数计算直边矩形。

x, y, w, h = cv2.boundingRect(contour)

参数说明:

contour:输入的目标轮廓(由 cv2.findContours() 提供)。

返回值

  • x:矩形左上角的 X 坐标。
  • y:矩形左上角的 Y 坐标。
  • w:矩形的宽度。
  • h:矩形的高度。

用例:

  • 确定目标区域的大小和位置。
  • 在目标上绘制外界矩形。

3. 旋转矩形

3.1 接口定义

OpenCV 提供了 cv2.minAreaRect() 函数计算旋转矩形。

rect = cv2.minAreaRect(contour)

参数说明:

contour:输入的目标轮廓。

返回值

rect:旋转矩形的属性,包括中心点坐标、尺寸(宽和高)、旋转角度。

3.2 获取旋转矩形的顶点

旋转矩形的顶点可以通过 cv2.boxPoints() 函数计算:

box = cv2.boxPoints(rect)
box = np.int0(box)  # 转换为整数

 4. 代码示例

以下代码展示了如何使用 OpenCV 绘制直边矩形和旋转矩形。

import cv2
import numpy as np

# 创建一张测试图像
image = np.zeros((400, 400), dtype=np.uint8)
cv2.ellipse(image, (200, 200), (100, 60), 30, 0, 360, 255, -1)  # 添加椭圆区域

# 查找轮廓
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 创建彩色图像用于绘制
output = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)

# 遍历轮廓
for contour in contours:
    # 直边矩形
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 绘制直边矩形

    # 旋转矩形
    rect = cv2.minAreaRect(contour)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(output, [box], 0, (0, 0, 255), 2)  # 绘制旋转矩形

# 显示结果
cv2.imshow('Rectangles', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行代码后,生成的图像中:

  • 绿色矩形:直边矩形,边与坐标轴平行。
  • 红色矩形:旋转矩形,更紧密地包围目标。

5. 应用场景

  • 目标检测:通过外界矩形快速确定目标位置。
  • 目标裁剪:利用外界矩形提取目标区域。
  • 图像分析:结合矩形的大小和角度,分析目标的几何特性。
  • 形状匹配:通过旋转矩形的角度和尺寸,进行形状匹配与分类。

6. 注意事项

  • 直边矩形的局限性:对于非水平或非垂直的目标区域,直边矩形可能会包含大量无关区域。
  • 旋转矩形的复杂性:旋转矩形更紧密,但顶点的计算需要额外步骤。
  • 二值图像的要求:cv2.findContours() 需要二值图像作为输入,因此在计算外界矩形之前需先进行二值化处理。