在图像上绘制几何图形

绘制圆形circle()

OpenCV4提供了circle()函数用于绘制圆形

circle()函数原型:

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

绘制直线line()

在OpenCV中提供了line()函数用于绘制直线

line()函数原型:

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

绘制椭圆ellipse()

在OpenCV中提供了ellipse()函数用于绘制椭圆

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:椭圆弧终止的角度,单位为度

在OpenCV中还提供了另一个名为ellipse2Poly()的函数用于输出椭圆边界的像素坐标,但是不会在图像中绘制椭圆

ellipse2Poly()函数原型:

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

绘制多边形rectangle()

在OpenCV中提供了函数rectangle()函数fillPoly()用于绘制多边形

rectangle()函数原型:

void cv::rectangle(InputOutArray img,
                   Point pt1,
                   Point pt2,
                   const Sclar& color,
                   int thickness = 1,
                   int lineType = LINE_8,
                   int shift = 0
                   )


void cv::rectangle(InputOutArray img,
                   Rect rec,
                   const Scalar& color,
                   int thickness = 1,
                   int lineType = LINE_8,
                   int shift = 0
                   )
  • pt1:矩形的一个顶点
  • pt2:矩形中与pt1相对的顶点,即两个点在对角线上
  • rec:矩形左上角顶点和长度
  • color:直线的颜色,用三通道表示
  • thickness:轮廓的宽度,如果数值为负,则绘制一个实心圆
  • shift:中心坐标和半径数值中的小数数位

Rect变量,该变量在OpenCV中表示矩形的含义,与Point,Vec3b等类型相同,Rect表示的是矩形的左上角像素坐标,以及矩形的长和宽,该类型定义的格式为Rect(像素的X坐标,像素的Y坐标,矩形的宽,矩形的高)

fillPoly()函数原型:

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:每个多边形顶点数组中顶点的个数
  • ncoutours:绘制多边形的个数
  • offset:所有顶点的可选偏移

文字生成putText()

在OpenCV中提供了在图像生成的文字putText()函数

putText()函数原型:

void cv::putText(InputOutputArray img,
                 const String& text,
                 Point org,
                 int fontFace,
                 double fontScale,
                 Scalar color,
                 int thickness = 1,
                 int lineType = LINE_8,
                 bool bottomLeftOrigin = false
                 )
  • text:输出到图像的文字,目前OpenCV只支持英文
  • org:图像中文字字符的左下角像素坐标
  • fontFace:字体类型的选择标志、参数取值范围及含义在下表中给出
  • fontScale:字体的大小
  • bottomLeftOrigin:图像数据原点的位置。默认为左上角;如果参数改为true,则原点为左下角

fontFace字体类型及含义

标志 简记 含义
FONT_HERSHEY_SIMPLEX 0 正常大小的无衬线字体
FONT_HERSHEY_PLAIN 1 小尺寸的无衬线字体
FONT_HERSHEY_DUPLEX 2 正常大小的较复杂的无衬线字体
FONT_HERSHEY_COMPLEX 3 正常大小的衬线字体
FONT_HERSHEY_TRIPLEX 4 正常大小的较复杂的衬线字体
FONT_HERSHEY_COMPLEX_SMALL 5 小尺寸的衬线字体
FONT_HERSHEY_SCRIPT_SIMPLEX 6 手写风格的字体
FONT_HERSHEY_SCRIPT_COMPLEX 7 复杂的手写风格字体
FONT_ITALIC 16 斜体字体

示例:

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat img = Mat::zeros(Size(512, 512), CV_8UC3);  //生成一个黑色图像用于绘制几何图形
    //绘制圆形
    circle(img, Point(50, 50), 25, Scalar(255, 255, 255), -1);  //绘制一个实心圆
    circle(img, Point(100, 50), 20, Scalar(255, 255, 255), 4);  //绘制一个空心圆
    //绘制直线
    line(img, Point(100, 100), Point(200, 100), Scalar(255, 255, 255), 2, LINE_4,0);
    //绘制椭圆
    ellipse(img, Point(300,255), Size(100, 70), 0, 0, 100, Scalar(255,255,255), -1);
    ellipse(img, RotatedRect(Point2f(150,100), Size2f(30,20), 0), Scalar(0,0,255),2);
    vector<Point> points;
     //用一些点来近似一个椭圆
    ellipse2Poly(Point(200, 400), Size(100, 70),0,0,360,2,points);
    for (int i = 0; i < points.size()-1; i++)  //用直线把这个椭圆画出来
    {
        if (i==points.size()-1)
        {
        //椭圆中后于一个点与第一个点连线
        line(img, points[0], points[i], Scalar(255, 255, 255), 2);
        break;
        }
      //当前点与后一个点连线
      line(img, points[i], points[i+1], Scalar(255, 255, 255), 2);
    }
    //绘制矩形
    rectangle(img, Point(50, 400), Point(100, 450), Scalar(125, 125, 125), -1);
    rectangle(img, Rect(400,450,60,50), Scalar(0, 125, 125), 2);
    //绘制多边形
    Point pp[2][6];
    pp[0][0] = Point(72, 200);
    pp[0][1] = Point(142, 204);
    pp[0][2] = Point(226, 263);
    pp[0][3] = Point(172, 310);
    pp[0][4] = Point(117, 319);
    pp[0][5] = Point(15, 260);
    pp[1][0] = Point(359, 339);
    pp[1][1] = Point(447, 351);
    pp[1][2] = Point(504, 349);
    pp[1][3] = Point(484, 433);
    pp[1][4] = Point(418, 449);
    pp[1][5] = Point(354, 402);
    Point pp2[5];
    pp2[0] = Point(350, 83);
    pp2[1] = Point(463, 90);
    pp2[2] = Point(500, 171);
    pp2[3] = Point(421, 194);
    pp2[4] = Point(338, 141);
    const Point* pts[3] = { pp[0],pp[1],pp2 };  //pts变量的生成
    int npts[] = { 6,6,5 };  //顶点个数数组的生成
    fillPoly(img, pts, npts, 3, Scalar(125, 125, 125),8);  //绘制3个多边形
    //生成文字
    putText(img, "Learn OpenCV 4",Point(100, 400), 2, 1, Scalar(255, 255, 255));
    imshow("", img);
    waitKey(0);
    return 0;
}

results matching ""

    No results matching ""