OpenCV:七、绘制图形与文字

2020-09-13  本文已影响0人  马洪滔

前言

在上一章中描述了图像亮度与对比度的调整,详细描述可点击查看(https://www.jianshu.com/writer#/notebooks/47386368/notes/76843898)

目标

本章中,将学习如何:

重要绘图元素介绍

  1. cv::Point
    Point表示平面上一个点(x,y);其中x,y都是整数,OpenCV关于Point的定义如下:
typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point;

其中Point_是一个模板类(如果需要多个函数具有相同的解决问题的逻辑,只是它们所使用的形参的类型不同,则可以使用函数模板。同样,如果需要得多个类仅在其某些数据成员的类型方面有所不同,或者仅在其成员函数的形参类型方面有所不同,则都可以使用类模板)。常用的类型还有Point2f、Point3f;2f-二位坐标,坐标的类型为float。3f同理。

  1. cv::Scalar
    Scalar表示一个四元向量,在OpenCV中通常使用其前三个向量表示颜色。Scalar在OpenCV中定义如下:
Scalar(a,b,c);  // a = blue,b = green, c = red表示RGB三个通道
typedef Scalar_<double> Scalar;

图像绘制

Mat src, dst;
void myLines();

int main()
{
        src = imread("../lena512color.tiff");
    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }
    char input_win[] = "input image";
    //cvtColor(src, src, COLOR_BGR2GRAY);
    namedWindow(input_win, WINDOW_AUTOSIZE);
    imshow(input_win, src);
    dst = src.clone();
    myLines();
    char output_title[] = "demo";
    namedWindow(output_title, WINDOW_AUTOSIZE);
    imshow(output_title, dst);
        waitKey(0);
    return 0;
}

void myLines()
{
    Point p1 = Point(20, 30);
    Point p2;
    p2.x = 300;
    p2.y = 300;
    Scalar color = Scalar(0, 0, 255);
    line(dst, p1, p2, color, 1, LINE_8);
}
绘制直线.png

函数说明:
1.在图像上绘制一条pt1到pt2的直线,img一般是Mat类型。
2.thickness-表示绘制的线的宽度。
3.lineType-表示线形。OpenCV中有三种可以选择LINE_4、LINE_8、lINE_AA。其中LINE_4表示采用4邻接的方式绘制,LINE_8表示采用8邻接的方式绘制,LINE_AA表示高斯滤波抗锯齿。
4.-表示坐标中的小数点位数。

void myRectangle()
{
    Rect rect = Rect(20, 30, 200, 200);
    Scalar color = Scalar(255,0,0);
    rectangle(dst, rect, color, 8, LINE_8);
}
绘制矩形.png
void myEllipse()
{
    Scalar color = Scalar(0, 255, 0);
    ellipse(dst, Point(dst.cols / 2, dst.rows / 2), Size(dst.cols / 4, dst.rows / 8), 90, 0, 180, color, 8, LINE_8);
}
绘制椭圆.png

函数说明:
1.axes-表示椭圆长轴和短轴长度的一半。
2.angle、startAngle、endAngle-分别表示椭圆旋转的角度,圆弧开始的角度和圆弧结束的角度
3.thickness-表示线宽,如果取-1表示绘制填充图形

void myCircle()
{
    Scalar color = Scalar(0, 255, 255);
    circle(dst, Point(dst.cols / 2, dst.rows / 2), 100, color, 8);
}
绘制圆.png

函数说明:center-表示圆心。radius-表示半径。

void muPolygon()
{
    Point pts[1][5];
    pts[0][0] = Point(100, 100);
    pts[0][1] = Point(100, 200);
    pts[0][2] = Point(200, 200);
    pts[0][3] = Point(200, 100);
    pts[0][4] = Point(100, 100);
    const Point* ppts[] = { pts[0] };
    int npt[] = { 5 };
    Scalar color = Scalar(255, 12, 255);
    fillPoly(dst, ppts, npt, 1, color, LINE_8);
}
绘制Polygon.png

函数说明:
1.pts-绘制多边形的各个点。
2.npts-绘制多边形点的数目。
3.ncontour-绘制的多边形的数量。
4.offset-轮廓所有点的可选偏移量。

putText(dst, "Hello OpenCV", Point(dst.cols / 2, dst.rows / 2), FONT_HERSHEY_COMPLEX, 1, Scalar(18, 26, 189), 5);
绘制文字.png

函数说明:
1.org-字体所在矩形的起始点,左下角。
2.fontFace-字体类型。
3.fontScale-字体比例因子。比例因子*字体类型基本大小=字体大小
4.bottomLeftOrigin-如果为true,则图像数据原点位于左下角。 否则,它位于左上角。

//绘制随机直线
void myrng() {
    RNG rng(12345);//生成高斯随机函数
    Point p1;
    Point p2;
    Mat RNGimage(500, 500, CV_8UC3, Scalar(0, 0, 0));
    for (int i = 0; i<10; i++) {
        p1.x = rng.uniform(0, RNGimage.cols);//生成任意x坐标
        p2.x = rng.uniform(0, RNGimage.cols);
        p1.y = rng.uniform(0, RNGimage.rows);//生成任意y坐标
        p2.y = rng.uniform(0, RNGimage.rows);
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机生成颜色
        line(RNGimage, p1, p2, color, 1, LINE_8);//画直线
    }
    namedWindow("绘制随机直线");
    imshow("绘制随机直线", RNGimage);
    waitKey(0);
}
随机线绘制.png
上一篇下一篇

猜你喜欢

热点阅读