Skip to content

基本几何图形绘制

本教程中你将学到如何:

  • 使用 OpenCV 函数 line() 绘制一条直线
  • 使用 OpenCV 函数 ellipse() 绘制一个椭圆
  • 使用 OpenCV 函数 rectangle() 绘制一个矩形
  • 使用 OpenCV 函数 circle() 绘制一个圆
  • 使用 OpenCV 函数 fillPoly() 绘制一个填充多边形

在本教程中,我们将大量使用两个结构:cv::Point 和 cv::Scalar: 在本教程中,我们将大量使用两个结构:cv::Point 和 cv::Scalar: 在本教程中,我们将大量使用 Python 中的元组来替代 cv::Point 和 cv::Scalar:

它表示一个二维点,由其图像坐标 xx 与 yy 指定。我们可以这样定义它:

Point pt;
pt.x = 10;
pt.y = 8;

或

Point pt = Point(10, 8);
Point pt = new Point();
pt.x = 10;
pt.y = 8;

或

Point pt = new Point(10, 8);
pt = (10, 0) # x = 10, y = 0
  • 表示一个 4 元素向量。Scalar 类型在 OpenCV 中被广泛用于传递像素值。
  • 在本教程中,我们将大量使用它来表示 BGR 颜色值(3 个参数)。如果最后一个参数不会用到,则不必定义。
  • 来看一个例子,如果要求提供一个颜色参数,而我们给出:
Scalar( a, b, c )
Scalar( a, b, c )
( a, b, c )

Drawing_1_Tutorial_Result_0.png

我们就定义了一个这样的 BGR 颜色:*Blue = a*、*Green = b*、*Red = c*。
  • 该代码位于你的 OpenCV 示例文件夹中。你也可以从 这里 获取。 代码见下方示例

  • 该代码位于你的 OpenCV 示例文件夹中。你也可以从 这里 获取。 代码见下方示例

  • 该代码位于你的 OpenCV 示例文件夹中。你也可以从 这里 获取。 代码见下方示例

由于我们打算绘制两个示例(一个原子和一个 rook),我们需要创建两幅图像和两个窗口来显示它们。

我们创建了一些函数来绘制不同的几何形状。例如,绘制原子时使用了 MyEllipse 与 MyFilledCircle:

而绘制 rook 时使用了 MyLine、rectangle 以及 MyPolygon:

下面我们逐个查看这些函数的内部实现:

  • 可以看到,MyLine 只是调用了函数 line(),该函数执行如下操作:
    • 从点 start 到点 end 绘制一条直线
    • 该直线显示在图像 img 中
    • 直线颜色由 B( 0, 0, 0 ) 定义,这是对应 Black(黑色)的 RGB 值
    • 线宽设置为 thickness(本例中为 2)
    • 该直线是 8 连通的(lineType = 8)
  • 从上面的代码可以看到,函数 ellipse() 绘制一个满足如下条件的椭圆:

    • 该椭圆显示在图像 img 中
    • 椭圆中心位于点 B(w/2, w/2),并包含在一个大小为 B(w/4, w/16) 的外接矩形中
    • 椭圆旋转了 angle 度
    • 椭圆的弧在 0 到 360 度之间
    • 图形的颜色为 B( 255, 0, 0 ),即在 BGR 值中表示蓝色
    • 椭圆的 thickness(线宽)为 2
  • 与椭圆函数类似,可以看到 circle 接收如下参数:

    • 用于显示该圆的图像(img)
    • 圆心,由点 center 表示
    • 圆的半径:w/32
    • 圆的颜色:B( 0, 0, 255 ),在 BGR 中表示 Red(红色)
    • 由于 thickness = -1,该圆将被填充绘制
  • 绘制填充多边形时,我们使用函数 fillPoly()。需要注意:

    • 多边形将绘制在 img 上
    • 多边形的顶点是 ppt 中的点集
    • 多边形的颜色由 B( 255, 255, 255 ) 定义,这是 white(白色)的 BGR 值
  • 最后是 cv::rectangle 函数(我们并没有为它单独创建一个特殊函数)。需要注意:

    • 矩形将绘制在 rook_image 上
    • 矩形的两个对角顶点由 B( 0, 7*w/8 ) 与 B( w, w ) 定义
    • 矩形的颜色由 B( 0, 255, 255 ) 给出,这是 yellow(黄色)的 BGR 值
    • 由于线宽值由 FILLED (-1) 给出,该矩形将被填充

编译并运行你的程序后,应当会得到类似如下的结果: