C#:BoundingRect()函数

总目录

  • 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容