OpenCV基本绘图函数

发布 : 2019-01-29 分类 : 计算机视觉 浏览 :

线段:line 函数

1
CV_EXPORTS_W void line(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineT ype=8, int shift=0);
  • img: 要绘制线段的图像。

  • pt1: 线段的起点。
  • pt2: 线段的终点。
  • color: 线段的颜色,通过一个Scalar对象定义。
  • thickness: 线条的宽度。
  • lineType: 线段的类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波)。
  • shift: 坐标点小数点位数。
  • 椭圆:ellipse 函数

    1
    CV_EXPORTS_W void ellipse(CV_IN_OUT Mat& img, Point center, Size axes,double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1,int lineType=8, int shift=0);
    • img: 要绘制椭圆的图像。
    • center: 椭圆中心点坐标。
    • axes: 椭圆位于该Size决定的矩形内。(即定义长轴和短轴)。
    • angle: 椭圆旋转角度。
    • startAngle: 椭圆开始绘制时角度。
    • endAngle: 椭圆绘制结束时角度。(若绘制一个完整的椭圆,则startAngle=0, endAngle = 360)。
    • color: 椭圆的颜色。
    • thickness: 绘制椭圆线粗。负数表示全部填充。
    • lineType、shift:同上。

    矩形:rectangle 函数

    1
    CV_EXPORTS_W void rectangle(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0);
    • pt1: 矩形的左上角坐标。
    • pt2: 矩阵的右下角坐标。
    • 其余同上。

    圆:circle 函数

    1
    CV_EXPORTS_W void circle(CV_IN_OUT Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0);
    • center: 圆心坐标。
    • radius: 半径。
    • 其余同上。

    填充多边形:fillPoly 函数

    1
    CV_EXPORTS void fillPoly(Mat& img, const Point** pts,const int* npts, int ncontours, const Scalar& color, int lineType=8, int shift=0, Point offset=Point() );
    • pts: 多边形定点集。
    • npts: 多边形的顶点数目。
    • ncontours: 要绘制多边形的数量。
    • offset: 所有点轮廓的可选偏移。
    • 其余同上。

    显示文字:PutText 函数

    1
    void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )
    • img – 显示文字所在图像.
    • text – 待显示的文字.
    • org – 文字在图像中的左下角 坐标.
    • font – 字体结构体.
    • fontFace – 字体类型, 可选择字体:

      FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN,
      FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX,
      FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL,
      FONT_HERSHEY_SCRIPT_SIMPLEX, or FONT_HERSHEY_SCRIPT_COMPLEX,
      以上所有类型都可以配合FONT_HERSHEY_ITALIC使用,产生斜体效果。

    • fontScale – 字体大小,该值和字体内置大小相乘得到字体大小
    • color – 文本颜色
    • thickness – 写字的线的粗细
    • lineType – 线型.
    • bottomLeftOrigin – true, 图像数据原点在左下角。否则, 图像数据原点在左上角.

    示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    #include<core.hpp>
    #include<highgui.hpp>
    #include<imgproc.hpp>
    using namespace cv;

    #define WINDOW_NAME1 "[绘制图1]" //为窗口标题定义的宏
    #define WINDOW_NAME2 "[绘制图2]" //为窗口标题定义的宏
    #define WINDOW_WIDTH 600 //定义窗口大小的宏

    //绘制不同角度。相同尺寸的椭圆
    void DrawEllipse(Mat img, double angle)
    {
    int thickness = 2;
    int lineType = 8;
    ellipse(img, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2),
    Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16), angle,
    0, 360, Scalar(255, 129, 0), thickness, lineType);
    }

    //绘制实心圆
    void DrawFilledCircle(Mat img, Point center)
    {
    int thickness = -1; //线粗
    int lineType = 8;
    circle(img, center, WINDOW_WIDTH / 32, Scalar(0, 0, 255),
    thickness, lineType);
    }

    //实现凹多边形绘制
    void DrawPolygon(Mat img)
    {
    int lineType = 8;

    //创建一些点
    Point rootPoints[1][20];
    rootPoints[0][0] = Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
    rootPoints[0][1] = Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
    rootPoints[0][2] = Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
    rootPoints[0][3] = Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
    rootPoints[0][4] = Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
    rootPoints[0][5] = Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
    rootPoints[0][6] = Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
    rootPoints[0][7] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rootPoints[0][8] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rootPoints[0][9] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rootPoints[0][10] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rootPoints[0][11] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rootPoints[0][12] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rootPoints[0][13] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rootPoints[0][14] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rootPoints[0][15] = Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
    rootPoints[0][16] = Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
    rootPoints[0][17] = Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
    rootPoints[0][18] = Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
    rootPoints[0][19] = Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
    const Point* ppt[1] = { rootPoints[0] };
    int npt[] = { 20 };
    fillPoly(img, ppt, npt, 1, Scalar(255, 255, 255), lineType);
    }

    // 绘制线
    void DrawLine(Mat img, Point start, Point end)
    {
    int thickness = 2;
    int lineType = 8;
    line(img, start, end, Scalar(0, 0, 0), thickness, lineType);
    }


    int main()
    {
    //创建空白的Mat图像
    Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
    Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);

    //----------- 绘制化学中原子的示例图-----------
    //1.先绘制出椭圆
    DrawEllipse(atomImage, 90);
    DrawEllipse(atomImage, 0);
    DrawEllipse(atomImage, 45);
    DrawEllipse(atomImage, -45);

    //2.再绘制出圆心
    DrawFilledCircle(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2));

    //----------- 绘制组合图形----------------
    //1.线绘制出多边形
    DrawPolygon(rookImage);

    //2.绘制矩形
    rectangle(rookImage, Point(0, 7 * WINDOW_WIDTH),
    Point(WINDOW_WIDTH, WINDOW_WIDTH), Scalar(0, 255, 255), -1, 8);

    //2.绘制一些线段
    DrawLine(rookImage, Point(0, 15 * WINDOW_WIDTH / 16),
    Point(WINDOW_WIDTH, 15 * WINDOW_WIDTH / 16));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8),
    Point(WINDOW_WIDTH / 4, WINDOW_WIDTH));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8),
    Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
    DrawLine(rookImage, Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8),
    Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH));

    //3.显示绘制出的图像
    imshow(WINDOW_NAME1, atomImage);
    moveWindow(WINDOW_NAME1, 0, 200);
    imshow(WINDOW_NAME2, rookImage);
    moveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200);

    waitKey(0);
    return 0;
    }

    本文作者 : HeoLis
    原文链接 : http://ishero.net/OpenCV基本绘图函数.html
    版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

    学习、记录、分享、获得

    微信扫一扫, 向我投食

    微信扫一扫, 向我投食