OpencvSharp 算子学习教案之 - Cv2.Rectangle 重载4
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,最适合下面这些场景:
- 你已经有两个角点,但目标图像就是
Mat。 - 你想让绘图代码保持最直观的
Mat + Point风格。 - 你要和鼠标交互、角点检测结果直接衔接。
它常用于:
- 目标检测框。
- 鼠标拖拽选框。
- 角点范围显示。
- 教学中演示便利重载的写法。
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 版本的算法语义一致:
- 先读取两个角点。
- 再根据
lineType绘制边框像素。 - 如果
thickness<0,就直接填满区域。
对初学者来说,最关键的是理解:
Mat是更具体的目标类型。Point仍然表示矩形的两个对角点。- 画出来的矩形仍然是轴对齐的。
OpenCvSharp 把这个重载单独提供出来,是为了让常见的 Mat 绘图代码更简洁。
5. 参数含义解析
| 参数名 | 类型 | 必填 | 含义 |
|---|---|---|---|
| img | Mat | 是 | 要被绘制的图像 |
| pt1 | Point | 是 | 矩形一个角点 |
| pt2 | Point | 是 | 与 pt1 对角的角点 |
| color | Scalar | 是 | 矩形颜色 |
| thickness | int | 否 | 线宽,默认 1;小于 0 时填充 |
| lineType | LineTypes | 否 | 线型,默认 Link8 |
| shift | int | 否 | 固定点小数位,默认 0 |
补充说明:
Mat版本最适合和普通图像处理流水线一起使用。- 两个
Point版本更容易和鼠标选框对应起来。 - 便利重载不改变图形本身的几何意义。
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. 注意事项
Mat版本只是便利封装,不会改变矩形的语义。- 两个点最好尽量写成一左一右、一上一下,便于阅读。
- 如果要填充矩形,仍然使用
thickness<0。 LineTypes.AntiAlias更适合展示图。
9. 调优建议
- 如果你的程序已经全程用
Mat,优先使用这个重载。 - 若要突出矩形范围,可先用填充色再叠加边框。
- 需要更平滑的边缘时,用
AntiAlias。 - 需要更强的像素风格时,用
Link8。
10. 进阶扩展
- 可以把这个重载和鼠标拖拽框选结合起来。
- 可以把
Mat + Point与Mat + Rect并排比较。 - 可以在矩形内部叠加标签、透明高亮和角点说明。
- 可以和
BoundingRect、ROI、FindContours一起串联起来讲。
11. 常见错误排查
- 把两个点当成宽高来理解。
- 误以为 Mat 版本和 InputOutputArray 版本在结果上不同。
- 把矩形看成旋转矩形。
- 忽略了
thickness<0的填充语义。
相关链接:
- WPF 教学控件:Cv2RectangleControl.xaml.cs
- 样例实现:RectangleMatPointSample.cs
- 官方文档源码位置:OpenCvSharp/Cv2/Cv2_imgproc.cs
更多推荐



所有评论(0)