OpencvSharp 算子学习教案之 - Cv2.Rectangle 重载4

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

Cv2.Rectangle

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

摘要:本页演示 Rectangle(Mat, Point, Point, Scalar, int, LineTypes, int) 如何直接以 Mat 作为目标、用两个角点绘制矩形,并说明它与 InputOutputArray 版本的关系。

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

public static void Rectangle(Mat img, Point pt1, Point pt2, Scalar color, int thickness = 1, LineTypes lineType = LineTypes.Link8, int shift = 0)

2. 函数用途

Cv2.Rectangle(...) 用来在图像上绘制一个轴对齐矩形。

这个重载直接接收 Mat 和两个 Point,最适合下面这些场景:

  1. 你已经有两个角点,但目标图像就是 Mat
  2. 你想让绘图代码保持最直观的 Mat + Point 风格。
  3. 你要和鼠标交互、角点检测结果直接衔接。

它常用于:

  1. 目标检测框。
  2. 鼠标拖拽选框。
  3. 角点范围显示。
  4. 教学中演示便利重载的写法。

3. 函数公式

两个角点定义的矩形范围可以表示为:

R = [ x m i n , x m a x ] × [ y m i n , y m a x ] R=[x_{min}, x_{max}] \times [y_{min}, y_{max}] R=[xmin,xmax]×[ymin,ymax]

Mat 版本不会改变这个几何定义,它只是把目标图像写成了更具体的类型。

thickness<0 时,矩形内部仍然会被填充;当 thickness>0 时,OpenCV 会只画边框。

4. 函数原理说明

这个函数和 InputOutputArray + Point 版本的算法语义一致:

  1. 先读取两个角点。
  2. 再根据 lineType 绘制边框像素。
  3. 如果 thickness<0,就直接填满区域。

对初学者来说,最关键的是理解:

  1. Mat 是更具体的目标类型。
  2. Point 仍然表示矩形的两个对角点。
  3. 画出来的矩形仍然是轴对齐的。

OpenCvSharp 把这个重载单独提供出来,是为了让常见的 Mat 绘图代码更简洁。

5. 参数含义解析

参数名 类型 必填 含义
img Mat 要被绘制的图像
pt1 Point 矩形一个角点
pt2 Point 与 pt1 对角的角点
color Scalar 矩形颜色
thickness int 线宽,默认 1;小于 0 时填充
lineType LineTypes 线型,默认 Link8
shift int 固定点小数位,默认 0

补充说明:

  1. Mat 版本最适合和普通图像处理流水线一起使用。
  2. 两个 Point 版本更容易和鼠标选框对应起来。
  3. 便利重载不改变图形本身的几何意义。

6. 应用场景列表

场景名 场景说明 典型用途
场景A:拖拽选框 鼠标拖出一个区域框 交互选区
场景B:角点显示 把两个角点框起来 几何教学
场景C:检测框 给算法结果画边框 目标检测
场景D:结果标注 直接在 Mat 上做注释 调试输出

7. 函数使用示例

说明:下面示例对应 WPF 场景 D。它直接使用 Mat + Point 版本绘制矩形,并保存成 PNG。

using OpenCvSharp;

internal static class Program
{
    private static void Main()
    {
        // 直接用 Mat 创建目标图像。
        using var canvas = new Mat(240, 400, MatType.CV_8UC3, Scalar.White);

        // 两个点表示矩形的对角点。
        var pt1 = new Point(84, 68);
        var pt2 = new Point(286, 190);

        // 这里直接调用 Mat + Point 重载。
        Cv2.Rectangle(
            canvas,
            pt1,
            pt2,
            new Scalar(220, 126, 72),
            2,
            LineTypes.AntiAlias,
            0);

        // 保存结果,方便直接观察边框和平滑效果。
        Cv2.ImWrite("rectangle-mat-point.png", canvas);
    }
}

8. 注意事项

  1. Mat 版本只是便利封装,不会改变矩形的语义。
  2. 两个点最好尽量写成一左一右、一上一下,便于阅读。
  3. 如果要填充矩形,仍然使用 thickness<0
  4. LineTypes.AntiAlias 更适合展示图。

9. 调优建议

  1. 如果你的程序已经全程用 Mat,优先使用这个重载。
  2. 若要突出矩形范围,可先用填充色再叠加边框。
  3. 需要更平滑的边缘时,用 AntiAlias
  4. 需要更强的像素风格时,用 Link8

10. 进阶扩展

  1. 可以把这个重载和鼠标拖拽框选结合起来。
  2. 可以把 Mat + PointMat + Rect 并排比较。
  3. 可以在矩形内部叠加标签、透明高亮和角点说明。
  4. 可以和 BoundingRectROIFindContours 一起串联起来讲。

11. 常见错误排查

  1. 把两个点当成宽高来理解。
  2. 误以为 Mat 版本和 InputOutputArray 版本在结果上不同。
  3. 把矩形看成旋转矩形。
  4. 忽略了 thickness<0 的填充语义。

相关链接:

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐