美文网首页
OpenCV:七、绘制图形与文字

OpenCV:七、绘制图形与文字

作者: 马洪滔 | 来源:发表于2020-09-13 16:09 被阅读0次

    前言

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

    目标

    本章中,将学习如何:

    • cv::Point与cv::Scalar的使用
    • 绘制线、矩形、圆、椭圆等基本几何形状
    • 随机生成与绘制文本

    重要绘图元素介绍

    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;
    

    图像绘制

    • 画线cv::line(LINE_4\LINE_8\LINE_AA)
      函数原型: void line(InputOutArray img, Point pt1, Pint pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
    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.-表示坐标中的小数点位数。

    • 画矩形cv::rectangle
      函数原型: void rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
    void myRectangle()
    {
        Rect rect = Rect(20, 30, 200, 200);
        Scalar color = Scalar(255,0,0);
        rectangle(dst, rect, color, 8, LINE_8);
    }
    
    绘制矩形.png
    • 画椭圆cv::elipseh
      函数原型:void ellipse(InputOutputArray img, Point center, Size axes,double angle, double startAngle, double endAngle,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
    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表示绘制填充图形

    • 画圆cv::circle
      函数原型:void circle(InputOutputArray img, Point center, int radius,const Scalar& color, int thickness = 1,int lineType = LINE_8,int shift = 0);
    void myCircle()
    {
        Scalar color = Scalar(0, 255, 255);
        circle(dst, Point(dst.cols / 2, dst.rows / 2), 100, color, 8);
    }
    
    绘制圆.png

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

    • 画填充cv::fillPoly
      函数原型: void fillPoly(InputOutputArray img, const Point** pts,const int* npts, int ncontours, const Scalar& color, int lineType =LINE_8, int shift = 0,Point offset = Point() );
    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-轮廓所有点的可选偏移量。

    • 文字绘制cv::putText
      函数原型:void putText( InputOutputArray img, const String& text, Point org, int fontFace, double fontScale, Scalar color, int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );
    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

    相关文章

      网友评论

          本文标题:OpenCV:七、绘制图形与文字

          本文链接:https://www.haomeiwen.com/subject/sajwektx.html