C++版本OpenCv教程(十九)绘制几何图形

绘制圆形

圆形是我们在平时中最常使用的图形之一,OpenCV 4中提供了circle()函数用于绘制圆型,其函数的函数原型在代码清单3-40中给出。

void cv::circle(InputOutputArray img,
                Point center,
                int  radius,
                const Scalar & color,
                int  thickness = 1,
                int  lineType = LINE_8,
                int  shift = 0 
                )
  • img:需要绘制圆形的图像
  • center:圆形的圆心位置坐标。
  • radius:圆形的半径长度,单位为像素。
  • color:圆形的颜色。
  • thickness:轮廓的宽度,如果数值为负,则绘制一个实心圆。
  • lineType:边界的类型,可取值为FILLED ,LINE_4 ,LINE_8 和LINE_AA
  • shift:中心坐标和半径数值中的小数位数。

该函数用于在一张图像中绘制圆形的图案,输入的参数分别是圆形的圆形位置、半径长度以及边界线的宽度和线型。对于该函数的使用我们将在本节最后的代码清单3-47中一起给出。

绘制直线

接下来介绍如何在图像中绘制直线。OpenCV 4中提供了line()函数用于绘制直线,其函数原型在代码清单3-41中给出。

void cv::line(InputOutputArray img,
              Point pt1,
              Point pt2,
              const Scalar & color,
              int  thickness = 1,
              int  lineType = LINE_8,
              int  shift = 0 
              )
  • pt1:直线起始点在图像中的坐标。
  • pt2:直线终点在图像中的坐标。
  • color:圆形的颜色,用三通道表示。

该函数利用两点确定一条直线的方式在图像中画出一条直线,函数中的很多参数的含义都与circle()函数一致,这里就不在赘述。对于该函数的使用我们将在本节最后的代码清单3-47中一起给出。

绘制椭圆

在OpenCV 4中提供了ellipse()函数用于绘制椭圆,其函数原型在代码清单3-42中所示。

void cv::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 
                 )
  • center:椭圆的中心坐标。
  • axes:椭圆主轴大小的一半。
  • angle:椭圆旋转的角度,单位为度。
  • startAngle:椭圆弧起始的角度,单位为度。
  • endAngle:椭圆弧终止的角度,单位为度

该函数中的很多参数的含义都与circle()函数一致,这里就不在赘述。函数通过选定椭圆中心位置和主轴的大小唯一确定一个椭圆,并且可以控制旋转角度改变椭圆在坐标系中的位置。通过椭圆弧起始和终止角度,可以绘制完整的椭圆或者一部分椭圆弧。与circle()函数一致,当边界线的厚度值为负数的时候,将绘制一个实心的椭圆。

在OpenCV 4中还提供了另外一个函数ellipse2Poly()用于输出椭圆的边界的像素坐标,但是不会在图像中绘制椭圆,其函数原型在代码清单3-43中给出。

void cv::ellipse2Poly(Point center,
                      Size axes,
                      int   angle,
                      int  arcStart,
                      int   arcEnd,
                      int   delta,
                      std::vector< Point > & pts
                      )
  • delta:后续折线顶点之间的角度,它定义了近似精度。
  • pts:椭圆边缘像素坐标向量集合。

该函数与绘制椭圆需要输入的参数一致,只是不将椭圆输出到图像中,而是通过vector向量将椭圆边缘的坐标点存储起来,便于后续的再处理。对于绘制椭圆相关函数的使用我们将在本节最后的代码清单3-47中一起给出。

绘制多边形

在几何中多边形也是一个重要的成员,而多边形中矩形又是一个比较特殊的类型,因此OpenCV 4中除了提供绘制多边形的函数fillPoly()外,也提供了绘制矩形的函数rectangle()。我们先介绍矩形的绘制,之后再介绍多边形的绘制。在代码清单3-44中给出了rectangle()函数的函数原型。

void cv::rectangle(InputOutputArray img,
                   Point pt1,
                   Point pt2,
                   const Scalar & color,
                   int  thickness = 1,
                   int  lineType = LINE_8,
                   int  shift = 0 
                   )
 
void cv::rectangle(InputOutputArray img,
                   Rect rec,
                   const Scalar & color,
                   int  thickness = 1,
                   int  lineType = LINE_8,
                   int  shift = 0 
                   )
  • pt1:矩形的一个顶点
  • pt2:矩形中与pt1相对的顶点,即两个点在对角线上。
  • rec:矩形左上角定点和长宽。

函数中与前文参数含义一致的参数不再重复介绍。在OpenCV 4中定义了两种函数原型,分别利用矩形对角线上的两个顶点的坐标或者利用左上角顶点坐标和矩形的长和宽唯一确定一个矩形。在绘制矩形时,同样可以控制边缘线的宽度绘制一个实心的矩形。

这里我们详细介绍Rect变量,该变量在OpenCV 4中表示矩形的含义,与Point、Vec3b等类型相同,都是在图像处理中常用的类型。Rect表示的是一个矩形的左上角和矩形的长和宽,该类型定义的格式为Rect(像素的x坐标,像素的y坐标,矩形的宽,矩形的高),其中可以存放的数据类型也分别为int型(Rect2i或者Rect)、double类型(Rect2d)和float类型(Rect2f)。

接下来介绍多边形绘制函数fillPoly()的使用方法,其函数原型在代码清单3-45中给出。

void cv::fillPoly(InputOutputArray img,
                  const Point ** pts,
                  const int * npts,
                  int   ncontours,
                  const Scalar & color,
                  int  lineType = LINE_8,
                  int   shift = 0,
                  Point offset = Point()
                  )
  • pts:多边形顶点数组,可以存放多个多边形的顶点坐标的数组。
  • npts:每个多边形顶点数组中顶点个数。
  • ncontours:绘制多边形的个数。
  • offset:所有顶点的可选偏移。

该函数中与前文含义相同的参数不再重复介绍。函数通过依次连接多边形的顶点来实现多边形的绘制,多边形的顶点需要按照顺时针或者逆时针的顺序依次给出,通过控制边界线宽度可以实现是否绘制实心的多边形。需要说明的是pts参数是一个数组,数组中存放的是每个多边形顶点坐标数组,npts参数也是一个数组,用于存放pts数组中每个元素中顶点的个数。关于多边形绘制的相关函数使用方法将在代码清单3-47中给出,读者一定要格外认真的体会使用方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值