欢迎光临
我们一直在努力

OpencvSharp 算子学习教案之 - Cv2.ContourArea 重载1

OpencvSharp 算子学习教案之 – Cv2.ContourArea 重载1

大家好,Opencv在很多工程项目中都会用到,而OpencvSharp则是以C#开发与实现的Opencv操作库,对.NET开发人员友好,但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳,因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案,供大家参考学习。

Cv2.ContourArea

  • 教案版本:V1.0
  • 面向对象:OpenCvSharp 初学者
  • 所属模块:imgproc
  • 源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs:3237

摘要:本页演示 ContourArea(InputArray) 如何从 Mat 轮廓计算面积,并说明默认返回绝对值,而 oriented=true 时会返回有向面积。

1. 函数名称(带参数签名)

public static double ContourArea(InputArray contour, bool oriented = false)

2. 函数用途

Cv2.ContourArea(…) 用来计算轮廓围成的面积。

这个重载最适合轮廓已经被封装进 Mat 的场景:

  • 可以直接从矩阵轮廓计算面积。
  • oriented 为 false 时返回绝对面积。
  • oriented 为 true 时返回有向面积,能够反映点序方向。
  • 它常用于:

  • 轮廓大小统计。
  • 对比不同轮廓的面积。
  • 判断轮廓点的方向。
  • 作为形状分析的基础指标之一。
  • 3. 函数公式

    ContourArea 使用 Green 公式计算多边形面积。

    绝对面积可写成:

    A

    =

    1

    2

    i

    =

    0

    n

    1

    (

    x

    i

    y

    i

    +

    1

    x

    i

    +

    1

    y

    i

    )

    A = \\frac{1}{2}\\left|\\sum_{i=0}^{n-1}(x_i y_{i+1} – x_{i+1} y_i)\\right|

    A=21

    i=0n1(xiyi+1xi+1yi)

    有向面积则保留符号:

    A

    s

    i

    g

    n

    e

    d

    =

    1

    2

    i

    =

    0

    n

    1

    (

    x

    i

    y

    i

    +

    1

    x

    i

    +

    1

    y

    i

    )

    A_{signed} = \\frac{1}{2}\\sum_{i=0}^{n-1}(x_i y_{i+1} – x_{i+1} y_i)

    Asigned=21i=0n1(xiyi+1xi+1yi)

    如果轮廓点顺序反转,有向面积通常也会跟着变号。

    4. 函数原理说明

    这个函数可以用“沿着轮廓边走一圈”的思路理解:

  • 把每一条边都当成一个向量。
  • 累加相邻边之间的叉积项。
  • 再根据 oriented 决定返回绝对值还是保留符号。
  • 对初学者来说,最需要记住的是:

  • ContourArea 计算的是多边形面积,不是外接矩形面积。
  • 自交轮廓会得到不可靠结果。
  • 点序和闭合方式都会影响结果。
  • 5. 参数含义解析

    参数名类型必填含义
    contour InputArray 输入轮廓
    oriented bool 是否返回有向面积

    补充说明:

  • 当 oriented=false 时,返回值始终是非负数。
  • 当 oriented=true 时,返回值会带正负号。
  • 这个重载适合直接处理 Mat 轮廓缓存。
  • 6. 应用场景列表

    场景名场景说明典型用途
    场景A:面积统计 统计轮廓占据的实际大小 目标分析
    场景B:方向判断 通过有向面积判断轮廓顺逆时针 几何处理
    场景C:形状筛选 用面积过滤过小或过大的轮廓 轮廓后处理
    场景D:教学对比 对比绝对面积和有向面积 初学者学习

    7. 函数使用示例(与 WPF 场景一一对应)

    说明:下面示例对应 WPF 场景 A。它先把轮廓包装成 Mat,再分别计算绝对面积和有向面积。

    using System;
    using System.Globalization;
    using OpenCvSharp;

    internal static class Program
    {
    private static void Main()
    {
    // 先准备一组简单、闭合、不会自交的轮廓点。
    Point2f[] points =
    {
    new Point2f(76.5f, 96.0f),
    new Point2f(164.0f, 58.5f),
    new Point2f(262.0f, 74.0f),
    new Point2f(304.0f, 136.0f),
    new Point2f(286.0f, 214.0f),
    new Point2f(196.0f, 262.0f),
    new Point2f(92.5f, 234.0f),
    new Point2f(58.0f, 150.0f),
    };

    // 先把点集包装成 Mat,这样就可以走 InputArray 重载。
    using var contourMat = Mat.FromArray(points);
    using var reversedMat = Mat.FromArray(new[]
    {
    new Point2f(58.0f, 150.0f),
    new Point2f(92.5f, 234.0f),
    new Point2f(196.0f, 262.0f),
    new Point2f(286.0f, 214.0f),
    new Point2f(304.0f, 136.0f),
    new Point2f(262.0f, 74.0f),
    new Point2f(164.0f, 58.5f),
    new Point2f(76.5f, 96.0f),
    });

    // 默认模式返回绝对面积。
    double absoluteArea = Cv2.ContourArea(contourMat);

    // oriented=true 时返回有向面积,方向会影响正负号。
    double orientedArea = Cv2.ContourArea(contourMat, true);
    double reversedOrientedArea = Cv2.ContourArea(reversedMat, true);

    Console.WriteLine($"PointCount = {points.Length}");
    Console.WriteLine($"AbsoluteArea = {absoluteArea.ToString("F2", CultureInfo.InvariantCulture)}");
    Console.WriteLine($"OrientedArea = {orientedArea.ToString("F2", CultureInfo.InvariantCulture)}");
    Console.WriteLine($"ReversedOrientedArea = {reversedOrientedArea.ToString("F2", CultureInfo.InvariantCulture)}");

    // 这行说明是这个重载最重要的教学点:同一个轮廓,点序不同,有向面积可能变号。
    Console.WriteLine("ContourArea 先算边界围成的面积,再根据 oriented 决定是否保留符号。\\n");
    }
    }

    8. 常见错误与避坑

  • 把 ContourArea 和 BoundingRect 面积混为一谈。
  • 误以为 oriented=true 只是“另一个返回方式”,其实它会影响符号。
  • 让轮廓出现自交,导致面积结果不可靠。
  • 忘记轮廓必须是闭合的点集。
  • 9. 进阶扩展

  • 可以用有向面积判断轮廓顺序是否需要反转。
  • 可以把面积作为轮廓筛选条件之一。
  • 可以和 Moments::m00 交叉验证轮廓面积。
  • 可以配合 DrawContours 把面积结果直接展示在图像上。
  • 10. 小结

    Cv2.ContourArea(…) 的 InputArray 重载适合已经封装成 Mat 的轮廓数据。

    如果你想统计面积并保留方向信息,oriented=true 是非常实用的开关。

    11. 相关链接

    • WPF 教学控件:Cv2ContourAreaControl.xaml.cs
    • 样例实现:ContourAreaInputArraySample.cs
    • 官方文档源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs
    赞(0)
    未经允许不得转载:171主机测评 » OpencvSharp 算子学习教案之 - Cv2.ContourArea 重载1
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址