OpencvSharp 算子学习教案之 - Cv2.RotatedRectangleIntersection 重载2
大家好,Opencv在很多工程项目中都会用到,而OpencvSharp则是以C#开发与实现的Opencv操作库,对.NET开发人员友好,但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳,因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案,供大家参考学习。
Cv2.RotatedRectangleIntersection
- 教案版本:V1.0
- 面向对象:OpenCvSharp 初学者
- 所属模块:imgproc
- 源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs:4306
摘要:本页演示RotatedRectangleIntersection(RotatedRect, RotatedRect, out Point2f[])如何直接返回交集顶点数组,并把交集结果继续用于绘图或面积计算。
1. 函数名称(带参数签名)
publicstaticRectanglesIntersectTypesRotatedRectangleIntersection(RotatedRectrect1,RotatedRectrect2,outPoint2f[]intersectingRegion)2. 函数用途
这个重载和上一页的数学意义一样,区别只是输出方式更直接:
- 函数会直接返回
Point2f[]。 - 你不用再手工从
Mat里读回顶点。 - 适合已经习惯在 C# 里处理点数组的场景。
如果你想马上把交集点传给Cv2.Polylines,这个重载通常更顺手。
3. 函数公式
两个旋转矩形的交集仍然是:
I = R 1 ∩ R 2 I = R_1 \cap R_2I=R1∩R2
函数会返回None、Partial或Full,并把交集顶点放进Point2f[]。
4. 函数原理说明
这个重载的核心流程和OutputArray版本相同:
- 先算两个旋转矩形的几何交集。
- 再把交集顶点装进数组。
- 返回交集类型,方便你先判断重叠状态。
对初学者来说,这个版本最容易理解,因为“输出就是数组”这件事最直接。
5. 参数含义解析
| 参数名 | 类型 | 必填 | 含义 |
|---|---|---|---|
| rect1 | RotatedRect | 是 | 第一个旋转矩形 |
| rect2 | RotatedRect | 是 | 第二个旋转矩形 |
| intersectingRegion | out Point2f[] | 是 | 输出交集顶点数组 |
补充说明:
- 这个重载的顶点数组可以直接参与后续 C# 几何运算。
- 如果没有交集,数组会是空数组。
- 顶点顺序可以直接用于绘制交集多边形。
6. 应用场景列表
| 场景名 | 场景说明 | 典型用途 |
|---|---|---|
| 场景A:直接数组处理 | 交集点集马上进入业务逻辑 | 几何计算 |
| 场景B:绘图教学 | 直接把数组画成多边形 | 教学演示 |
| 场景C:面积估计 | 交集点数足够时算面积 | 碰撞分析 |
| 场景D:对比学习 | 对比 OutputArray 和数组风格 | API 教学 |
7. 函数使用示例
说明:下面示例对应 WPF 场景 B。它直接接收
Point2f[]交集结果,并打印点数。
usingSystem;usingOpenCvSharp;internalstaticclassProgram{privatestaticvoidMain(){// 两个旋转矩形故意设计成部分重叠,便于观察交集顶点数组。varrect1=newRotatedRect(newPoint2f(162.0f,156.0f),newSize2f(186.0f,106.0f),-28.0f);varrect2=newRotatedRect(newPoint2f(212.0f,168.0f),newSize2f(170.0f,90.0f),22.0f);// out Point2f[] 重载会把顶点直接写进数组。varintersectionType=Cv2.RotatedRectangleIntersection(rect1,rect2,outPoint2f[]intersectionPoints);Console.WriteLine($"IntersectionType ={intersectionType}");Console.WriteLine($"PointCount ={intersectionPoints.Length}");// 如果顶点足够多,就可以继续计算交集面积。if(intersectionPoints.Length>=3){Console.WriteLine($"IntersectionArea ={Math.Abs(Cv2.ContourArea(intersectionPoints)):F2}");}}}8. 注意事项
Point2f[]适合直接参与 C# 几何处理,但读取前仍要先看返回值。- 没有交集时,数组会是空的。
- 如果你要继续画图,数组可以直接传给
Cv2.Polylines。 - 不要把它和一般的
Rect相交逻辑混淆。
9. 调优建议
- 如果你已经在代码里习惯用数组,这个重载最省心。
- 可以把返回数组和
ContourArea一起用,快速算交集面积。 - 先画两个矩形,再看交集,会比只看日志更容易理解。
- 需要保存中间结果时,数组比 Mat 更方便调试。
10. 进阶扩展
- 可以把这个重载和
OutputArray版本放在一起做 API 对比。 - 可以把数组直接传给自定义的多边形绘制函数。
- 可以把旋转框相交扩展成批量重叠筛选。
- 可以结合
BoxPoints讲旋转矩形顶点的固定顺序。
11. 常见错误排查
- 把空数组当成程序错误,实际上它可能只是“没有交集”。
- 误以为返回值是面积,实际上返回值是交集类型枚举。
- 交集点数很少时还强行做多边形面积计算。
- 没有先理解两个矩形的旋转方向,就直接读数组内容。
相关链接:
- WPF 教学控件:Cv2RotatedRectangleIntersectionControl.xaml.cs
- 样例实现:RotatedRectangleIntersectionPoint2fArraySample.cs
- 官方文档源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs