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 的场景:
它常用于:
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=0∑n−1(xiyi+1−xi+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=0∑n−1(xiyi+1−xi+1yi)
如果轮廓点顺序反转,有向面积通常也会跟着变号。
4. 函数原理说明
这个函数可以用“沿着轮廓边走一圈”的思路理解:
对初学者来说,最需要记住的是:
5. 参数含义解析
| contour | InputArray | 是 | 输入轮廓 |
| oriented | bool | 否 | 是否返回有向面积 |
补充说明:
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. 常见错误与避坑
9. 进阶扩展
10. 小结
Cv2.ContourArea(…) 的 InputArray 重载适合已经封装成 Mat 的轮廓数据。
如果你想统计面积并保留方向信息,oriented=true 是非常实用的开关。
11. 相关链接
- WPF 教学控件:Cv2ContourAreaControl.xaml.cs
- 样例实现:ContourAreaInputArraySample.cs
- 官方文档源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs





