-
Cv2.BoundingRect()是 OpenCV 中一个用于获取轮廓外接矩形的函数。
它计算一个给定轮廓的最小外接矩形,并返回矩形的坐标和尺寸。
这对于目标检测、形态分析和图像处理非常有用。
一、核心原理
- Cv2.BoundingRect() 函数的核心原理是通过给定的轮廓(即一系列的点)计算一个矩形,使得所有点都在矩形的内部。
该矩形是轮廓的最小外接矩形,不要求矩形与图像的坐标轴平行。
二、功能详解
Cv2.BoundingRect() 的功能是返回给定轮廓的最小外接矩形。
该矩形为水平或竖直的矩形(即与坐标轴平行),能完全包围轮廓中的所有点。通过这个矩形,我们可以轻松获得轮廓的定位信息(如位置和尺寸),常用于目标检测、区域选择、ROI(感兴趣区域)提取等任务。输入: 一个轮廓点集(通常是通过 Cv2.FindContours() 获取的轮廓)。
输出: 返回一个 Rect 类型对象,包含矩形的位置(左上角坐标)和尺寸(宽度和高度)。
三、参数
Rect Cv2.BoundingRect(Point[] points);
- points(输入参数):
一个表示轮廓的点集。通常是通过 Cv2.FindContours() 函数得到的轮廓,类型为 Point[]。这些点通常是轮廓的边界点。
注意:- 输入的点集 points 必须是一个封闭的轮廓集合。
- 如果轮廓包含多个子轮廓,函数会返回包含所有轮廓点的外接矩形。
- 返回值:
返回一个 Rect 类型的对象,表示轮廓的最小外接矩形。该矩形的坐标通常是 x, y,表示矩形左上角的坐标,宽度和高度分别为矩形的宽度和高度。
Rect 对象包含以下属性:- x:矩形左上角的 x 坐标。
- y:矩形左上角的 y 坐标。
- width:矩形的宽度。
- height:矩形的高度。
四、使用注意事项分析
矩形不一定是物体的最精确边界:
Cv2.BoundingRect() 总是计算与坐标轴平行的矩形,而不是最小外接矩形。因此,对于旋转的物体,返回的矩形可能会有较大的空白区域。轮廓的预处理:
如果轮廓包含噪声或不规则点,可能会导致返回的矩形过大或不准确。因此,预处理步骤(如边缘检测、轮廓平滑)在实际应用中至关重要。多个轮廓:
当轮廓包含多个子轮廓时,Cv2.BoundingRect() 会计算所有点的外接矩形。因此,在处理多个物体时,要注意这个特性,可能需要分别计算每个子轮廓的外接矩形。
五、运行时间优化方法
Cv2.BoundingRect() 本身的复杂度通常为 O(n),其中 n 是轮廓的点数。因此,在计算多个轮廓时,整体的时间复杂度会线性增加。优化方法包括:
减少轮廓点数量:
可以在调用 Cv2.FindContours() 时通过设置适当的阈值来减少轮廓点的数量,避免计算过多不必要的点。批处理多个轮廓:
当需要处理多个轮廓时,可以考虑批量计算最小外接矩形,避免重复的计算和冗余操作。轮廓合并:
对于较小且相邻的轮廓,可以尝试合并它们,减少计算负担。
六、示例
using OpenCvSharp;
class Program
{
static void Main(string[] args)
{
// 读取图像
Mat image = Cv2.ImRead("shapes.png", ImreadModes.Grayscale);
// 二值化图像
Mat binaryImage = new Mat();
Cv2.Threshold(image, binaryImage, 128, 255, ThresholdTypes.Binary);
// 查找轮廓
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(binaryImage, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 处理每个轮廓
foreach (var contour in contours)
{
Rect boundingRect = Cv2.BoundingRect(contour); // 获取外接矩形
// 绘制矩形
Cv2.Rectangle(image, boundingRect, new Scalar(0, 255, 0), 2);
}
// 显示结果图像
Cv2.ImShow("Bounding Rects", image);
Cv2.WaitKey(0);
}
}
七、相似算法
Cv2.MinAreaRect():
MinAreaRect() 返回的是一个旋转矩形(即最小面积矩形),而不仅仅是与坐标轴平行的矩形。这对于处理旋转或不规则形状的物体特别有用,适合场景中物体不是完全垂直或水平的情况。Cv2.FitEllipse():
对于椭圆形或弯曲的物体,Cv2.FitEllipse() 通过拟合一个椭圆来获得物体的外接框。这个方法在处理形状为椭圆的目标时,比 BoundingRect() 更加精准。Cv2.RotatedRect:
RotatedRect 是一种结构,表示旋转矩形,可以用来存储并处理与坐标轴不对齐的矩形框。它在某些应用场景中比普通的 BoundingRect() 更加灵活和精准。
八、资料
技能拾荒者《40-OpenCVSharp —- Cv2.BoundingRect()函数功能(轮廓外接矩形)详解》
https://blog.csdn.net/weixin_45590420/article/details/143950757