opencv内接矩形(opencv 截取矩形区域)

## OpenCV内接矩形

简介

在图像处理和计算机视觉中,经常需要找到包含特定形状(例如轮廓)的最小边界矩形。OpenCV 提供了多种方法来查找这些矩形,包括标准的边界矩形、旋转的边界矩形(也称为最小外接矩形)和内接矩形。本文重点介绍如何使用 OpenCV 查找轮廓的内接矩形。### 标准边界矩形 (cv2.boundingRect)`cv2.boundingRect()` 函数找到一个直立的矩形,它完全包含输入轮廓。这是最简单的边界矩形类型,但它可能不是最紧密的拟合,尤其是非轴对齐的轮廓。```python import cv2 import numpy as np# 创建一个示例轮廓 (例如,从图像中找到的轮廓) contour = np.array([[[10, 10]], [[100, 20]], [[90, 110]], [[20, 90]]], dtype=np.int32)# 找到标准边界矩形 x, y, w, h = cv2.boundingRect(contour)# 绘制矩形 (可选) img = np.zeros((150, 150, 3), dtype=np.uint8) cv2.drawContours(img, [contour], -1, (0, 255, 0), 2) cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) cv2.imshow("Bounding Rect", img) cv2.waitKey(0) cv2.destroyAllWindows() ```### 旋转边界矩形 (cv2.minAreaRect)`cv2.minAreaRect()` 函数计算包含轮廓的最小面积的旋转矩形。它返回一个 `RotatedRect` 对象,其中包含矩形的中心坐标、尺寸和旋转角度。```python # ... (同上)# 找到旋转边界矩形 rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) # 获取矩形的四个角点 box = np.int32(box) # 将角点坐标转换为整数# 绘制矩形 cv2.drawContours(img, [box], -1, (255, 0, 0), 2) cv2.imshow("Rotated Rect", img) cv2.waitKey(0) cv2.destroyAllWindows() ```### 内接矩形OpenCV 没有直接的函数来查找内接矩形。 但是,我们可以结合使用不同的技术来实现:1.

逼近轮廓:

使用 `cv2.approxPolyDP()` 函数将轮廓简化为具有较少顶点的多边形。这有助于消除噪声并使后续计算更容易。2.

查找凸包:

使用 `cv2.convexHull()` 查找轮廓的凸包。内接矩形必须包含在凸包内。3.

旋转和检查:

对于一系列旋转角度,计算与旋转凸包相对应的边界矩形。选择面积最小的矩形作为近似的内接矩形.```python # ... (同上)# 逼近轮廓 (可选) epsilon = 0.02

cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, epsilon, True)# 查找凸包 hull = cv2.convexHull(approx)# 旋转和检查 (简化示例 - 更精确的方法需要更细粒度的旋转和优化) min_area = float('inf') best_rect = Nonefor angle in range(0, 90, 1): # 旋转角度范围和步长可以调整rotated_hull = rotate_contour(hull, angle) # 需要自定义旋转函数 rotate_contourx, y, w, h = cv2.boundingRect(rotated_hull)area = w

hif area < min_area:min_area = areabest_rect = (x, y, w, h)# 绘制最佳矩形 (需要根据旋转角度调整绘制) # ...# 自定义旋转函数示例 (围绕中心旋转) def rotate_contour(cnt, angle):M = cv2.getRotationMatrix2D((0, 0), angle, 1) # 旋转中心设置为(0,0) - 需要根据实际情况调整return cv2.transform(cnt, M)```

总结

OpenCV 提供了便捷的函数来查找标准和旋转的边界矩形。 查找内接矩形需要更复杂的方法,例如结合轮廓逼近、凸包和旋转变换。 上述示例提供了一个基本的框架,可以根据特定应用的需求进行调整和优化. 需要根据实际情况调整旋转中心、角度范围和步长以获得更精确的结果. 还可以使用优化算法来更高效地找到最佳旋转角度.

OpenCV内接矩形**简介**在图像处理和计算机视觉中,经常需要找到包含特定形状(例如轮廓)的最小边界矩形。OpenCV 提供了多种方法来查找这些矩形,包括标准的边界矩形、旋转的边界矩形(也称为最小外接矩形)和内接矩形。本文重点介绍如何使用 OpenCV 查找轮廓的内接矩形。

标准边界矩形 (cv2.boundingRect)`cv2.boundingRect()` 函数找到一个直立的矩形,它完全包含输入轮廓。这是最简单的边界矩形类型,但它可能不是最紧密的拟合,尤其是非轴对齐的轮廓。```python import cv2 import numpy as np

创建一个示例轮廓 (例如,从图像中找到的轮廓) contour = np.array([[[10, 10]], [[100, 20]], [[90, 110]], [[20, 90]]], dtype=np.int32)

找到标准边界矩形 x, y, w, h = cv2.boundingRect(contour)

绘制矩形 (可选) img = np.zeros((150, 150, 3), dtype=np.uint8) cv2.drawContours(img, [contour], -1, (0, 255, 0), 2) cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) cv2.imshow("Bounding Rect", img) cv2.waitKey(0) cv2.destroyAllWindows() ```

旋转边界矩形 (cv2.minAreaRect)`cv2.minAreaRect()` 函数计算包含轮廓的最小面积的旋转矩形。它返回一个 `RotatedRect` 对象,其中包含矩形的中心坐标、尺寸和旋转角度。```python

... (同上)

找到旋转边界矩形 rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect)

获取矩形的四个角点 box = np.int32(box)

将角点坐标转换为整数

绘制矩形 cv2.drawContours(img, [box], -1, (255, 0, 0), 2) cv2.imshow("Rotated Rect", img) cv2.waitKey(0) cv2.destroyAllWindows() ```

内接矩形OpenCV 没有直接的函数来查找内接矩形。 但是,我们可以结合使用不同的技术来实现:1. **逼近轮廓:** 使用 `cv2.approxPolyDP()` 函数将轮廓简化为具有较少顶点的多边形。这有助于消除噪声并使后续计算更容易。2. **查找凸包:** 使用 `cv2.convexHull()` 查找轮廓的凸包。内接矩形必须包含在凸包内。3. **旋转和检查:** 对于一系列旋转角度,计算与旋转凸包相对应的边界矩形。选择面积最小的矩形作为近似的内接矩形.```python

... (同上)

逼近轮廓 (可选) epsilon = 0.02 * cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, epsilon, True)

查找凸包 hull = cv2.convexHull(approx)

旋转和检查 (简化示例 - 更精确的方法需要更细粒度的旋转和优化) min_area = float('inf') best_rect = Nonefor angle in range(0, 90, 1):

旋转角度范围和步长可以调整rotated_hull = rotate_contour(hull, angle)

需要自定义旋转函数 rotate_contourx, y, w, h = cv2.boundingRect(rotated_hull)area = w * hif area < min_area:min_area = areabest_rect = (x, y, w, h)

绘制最佳矩形 (需要根据旋转角度调整绘制)

...

自定义旋转函数示例 (围绕中心旋转) def rotate_contour(cnt, angle):M = cv2.getRotationMatrix2D((0, 0), angle, 1)

旋转中心设置为(0,0) - 需要根据实际情况调整return cv2.transform(cnt, M)```**总结**OpenCV 提供了便捷的函数来查找标准和旋转的边界矩形。 查找内接矩形需要更复杂的方法,例如结合轮廓逼近、凸包和旋转变换。 上述示例提供了一个基本的框架,可以根据特定应用的需求进行调整和优化. 需要根据实际情况调整旋转中心、角度范围和步长以获得更精确的结果. 还可以使用优化算法来更高效地找到最佳旋转角度.

标签列表