Han Xu's blogs
  • 🥳欢迎!
  • Linux
    • 【Linux_install】详细的Ubuntu和win双系统安装指南
    • 【Linux】分区向左扩容的方法
    • 【Linux】挂载硬盘并设置开机自动挂载
    • 【Linux】grub命令行引导进入windows系统
    • 【Linux】python版本控制和环境管理
    • 【Linux】安装n卡驱动,美化gnome
    • 【Linux】gnome桌面环境切换KDE Plasma
  • python
    • 【matplotlib教程】数据可视化
    • 【python】实战:大批量数据的处理和拟合
    • 【Python爬虫】批量爬取图片的简单案例
    • 【scikit-opt】七大启发式算法的使用
    • 【综合评价方法】常见综合评价方法及其实现
    • 【python教程】打包和发布自己的项目,让别人去pip
    • 【PyTorch】n卡驱动、CUDA Toolkit、cuDNN全解安装教程
    • 【Pytorch教程】迅速入门Pytorch深度学习框架
    • 【稀疏矩阵】使用torch.sparse模块
  • C_C++
    • 【CMake】掌握CMake基本操作
    • 【计算机二级C++】题目与C++知识自检
  • matlab
    • 【Matlab】基础教程
  • 🤖ROS
    • 【ROS教程】安装ROS全流程及可能遇到的问题
    • 【ROS教程】用CLion编译和调试ROS包的全流程及可能遇到的问题
    • 【ROS教程】ROS文件系统和基础架构
    • 【ROS教程】ROS常用命令
    • 【ROS教程】话题通信
    • 【ROS教程】服务通信
    • 【ROS教程】ROS常用API讲解
    • 【ROS教程】编写launch文件
  • 📷Computer_Vision
    • Novel_View_Synthesis
      • 【NeRF】由浅入深介绍Neural_Radiance_Fields
      • 【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化
      • 【3DGS】从新视角合成到3D_Gaussian_Splatting
      • 【NeRF】截至2024.12NeRF系列工作总结
    • SLAM
      • 【Survey】截至2024.12SLAM系列工作总结
    • OpenCV
      • 【OpenCV教程合集】一文入门和精通OpenCV(C_C++)
      • 【OpenCV教程】OpenCV中的数据类型
      • 【OpenCV教程】OpenCV中对矩阵的常用操作
      • 【OpenCV教程】对图像的各种常用操作
      • 【OpenCV教程】滤波和边缘检测的过程
      • 【OpenCV教程】如何优雅地画出一个几何图形
      • 【OpenCV教程】Trackbar到底怎么用?
      • 【OpenCV教程】轮廓检测过程
      • 【OpenCV教程】特征工程
  • 🗑️杂七杂八的~
    • 【LaTex、markdown】常用语法写出漂亮的blog
    • 【git教程】快速掌握git
    • 【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享
    • 《周易》:大衍筮法
    • 【PyCharm】解决虚拟环境pip无法使用问题
    • 【git】解决能访问github但克隆不了的问题
    • 【Windows终端美化】为什么你的终端千篇一律?
Powered by GitBook
On this page
  • 1.直线
  • 1.1 API
  • 1.2 连通类型
  • 2.正矩形
  • 2.1API
  • 3.圆形
  • 3.1 API
  • 4.椭圆
  • 4.1 API
  • 4.2 效果
  • 5 斜矩形
  • 5.1 API(通过RotatedRect类和line函数实现)
  • 6.多边形
  • 6.1 API

Was this helpful?

  1. Computer_Vision
  2. OpenCV

【OpenCV教程】如何优雅地画出一个几何图形

Previous【OpenCV教程】滤波和边缘检测的过程Next【OpenCV教程】Trackbar到底怎么用?

Last updated 9 months ago

Was this helpful?

@


1.直线

1.1 API

CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);
  • 参数如下

参数
含义

img(image)

绘制多边形的画布,数据类型Mat

pt1(point1)

端点1

pt2(point2)

端点2

color

绘制线条的颜色

thickness

绘制线条的粗细

lineType

绘制线条的连通类型

shift

坐标点小数点位数(not important)

1.2 连通类型

enum LineTypes {
    FILLED  = -1,
    LINE_4  = 4, //!< 4-connected line
    LINE_8  = 8, //!< 8-connected line
    LINE_AA = 16 //!< antialiased line
};
  • LINE_4与LINE_8差别不大,而LINE_AA的抗锯齿效果显著

2.正矩形

2.1API

CV_EXPORTS_W void rectangle(InputOutputArray img, Point pt1, Point pt2,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);
  • 参数如下

参数
含义

img(image)

绘制多边形的画布,数据类型Mat

pt1(point1)

左上角端点

pt2(point2)

右下角端点

color

绘制线条的颜色

thickness

绘制线条的粗细。若取负值,则表示进行填充

lineType

绘制线条的连通类型

shift

坐标点小数点位数(not important)

CV_EXPORTS_W void rectangle(InputOutputArray img, Rect rec,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);
  • 参数如下

参数
含义

img(image)

绘制多边形的画布,数据类型Mat

rec(rect)

一个矩形

color

绘制线条的颜色

thickness

绘制线条的粗细。若取负值,则表示进行填充

lineType

绘制线条的连通类型

shift

坐标点小数点位数(not important)

3.圆形

3.1 API

CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius,
                       const Scalar& color, int thickness = 1,
                       int lineType = LINE_8, int shift = 0);
  • 参数如下

参数
含义

img(image)

绘制多边形的画布,数据类型Mat

center

圆心坐标

radius

半径

color

绘制线条的颜色

thickness

绘制线条的粗细。若取负值,则表示进行填充

lineType

绘制线条的连通类型

shift

坐标点小数点位数(not important)

4.椭圆

4.1 API

CV_EXPORTS_W 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);
  • 参数如下

参数
含义

img(image)

绘制多边形的画布,数据类型Mat

center

圆心坐标

axes

(x方向上半轴长,y方向上半轴长)

angle

顺时针偏角

startAngle

以x方向上的正半轴为起点,偏移一定角度后的起点,从此起点开始画椭圆

endAngle

以x方向上的正半轴为起点,偏移一定角度后的终点,到此为止结束画椭圆

color

绘制线条的颜色

thickness

绘制线条的粗细。若取负值,则表示进行填充

lineType

绘制线条的连通类型

shift

坐标点小数点位数(not important)

4.2 效果

Mat canvas(Size(1000,1000),CV_8U,Scalar(255));
ellipse(canvas,Point2f(500,500),Size(50,100),0,0,90,Scalar(0,0,0),5);
imshow("canvas",canvas);
waitKey();
Mat canvas(Size(1000,1000),CV_8U,Scalar(255));
ellipse(canvas,Point2f(500,500),Size(50,100),20,0,360,Scalar(0,0,0),5);
imshow("canvas",canvas);
waitKey();
Mat canvas(Size(1000,1000),CV_8U,Scalar(255));
ellipse(canvas,Point2f(500,500),Size(50,100),20,0,180,Scalar(0,0,0),5);
imshow("canvas",canvas);
waitKey();

5 斜矩形

5.1 API(通过RotatedRect类和line函数实现)

class CV_EXPORTS RotatedRect
{
public:
    //! default constructor
    RotatedRect();
   
    /*center:质心坐标
      size:(x方向上全边长,y方向上全边长)
      angle:顺时针偏角
    */
    RotatedRect(const Point2f& center, const Size2f& size, float angle);

    /**
    三点确定一矩形,记得要互相垂直
     */
    RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

    /** 返回四个角点坐标,要用Point2f类型的数组对象作为参数传入,不能是仅仅是Point类型的数组对象*/
    void points(Point2f pts[]) const;

    //! returns the minimal up-right integer rectangle containing the rotated rectangle
    Rect boundingRect() const;

    //! returns the minimal (exact) floating point rectangle containing the rotated rectangle, not intended for use with images
    Rect_<float> boundingRect2f() const;

    //! returns the rectangle mass center
    Point2f center;

    //! returns width and height of the rectangle
    Size2f size;

    //! returns the rotation angle. When the angle is 0, 90, 180, 270 etc., the rectangle becomes an up-right rectangle.
    float angle;
};

下面是自定义的一个快捷画斜矩形的函数

void drawRotatedRect(InputOutputArray img, RotatedRect rRect,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0){
    Point2f vertices[4];
    rRect.points(vertices);
    for(int i=0;i<4;i++){
        line(img,vertices[i],vertices[(i+1)%4],color,lineType,shift);
    }
}

6.多边形

6.1 API

绘制方式一

CV_EXPORTS_W void polylines(InputOutputArray img, InputArrayOfArrays pts,
                            bool isClosed, const Scalar& color,
                            int thickness = 1, int lineType = LINE_8, int shift = 0 );
  • 参数如下

参数
含义

img(image)

绘制多边形的画布,数据类型Mat

pts(points)

多边形角点的坐标点集,数据类型vector<Point>或vector<vector<Point>>,若为vector<Point2f>或vector<vector<Point2f>>会报错

isClosed

多边形是否闭合,如果isClosed为真,那么pts的最后一个点将和第一个点连起来,否则轮廓被认为是不封闭的。

color

绘制线条的颜色

thickness

绘制线条的粗细。若取负值,则表示进行填充

lineType

绘制线条的连通类型

shift

坐标点小数点位数(not important)

绘制方式二

CV_EXPORTS void polylines(InputOutputArray img, const Point* const* pts, const int* npts,
                          int ncontours, bool isClosed, const Scalar& color,
                          int thickness = 1, int lineType = LINE_8, int shift = 0 );
  • 参数如下

参数
含义

img(image)

绘制多边形的画布,数据类型Mat

pts(points)

多个多边形的角点坐标点集的地址的数组。如果有3个四边形的角点坐标点集Point[3][4],那么pts={Point[0][0],Point[1][0],Point[2][0],}

npts(number points)

多个多边形的角点坐标点集的元素个数排列成的数组,用来指示需要用到pts[i]中的几个元素。如果有3个四边形的角点坐标点集Point[3][4],那么npts={4,4,4,}

ncontours

多边形的数量

isClosed

多边形是否闭合,如果isClosed为真,那么pts的最后一个点将和第一个点连起来,否则轮廓被认为是不封闭的。

color

绘制线条的颜色

thickness

绘制线条的粗细。若取负值,则表示进行填充

lineType

绘制线条的连通类型

shift

坐标点小数点位数(not important)

📷
TOC