图像几何形状绘制

绘制圆形

circle(img, center, radius, color, thickness)
  • img:需要绘制的图像
  • center:圆形的圆心位置坐标
  • radius:圆形的半径,单位为像素
  • color:圆形的颜色
  • thickness:轮廓的粗细,若为负值,则绘制一个实心圆

绘制矩形

// 原型一
rectangle(img, pt1, pt2, color, thickness)

// 原型二
rectangle(img, rec, color, thickness)
  • pt1:矩形的一个顶点

  • pt2:矩形中与pt1相对的顶点,即两个点在对角线上

  • rec:矩形左上角顶点和长宽

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

绘制直线

line(img, pt1, pt2, color, thickness)
  • pt1:直线起点在图像中的坐标
  • pt2:直线终点在图像中的坐标
  • color:直线的颜色,用三通道表示

绘制椭圆

ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness)
  • center:椭圆的中心坐标
  • axes:椭圆的长轴和短轴长度
  • angle:椭圆的旋转角度,单位为度
  • startAngle:椭圆弧的起始角度,单位为度
  • endAngle:椭圆弧的终止角度,单位为度

:通过椭圆弧起始和终止角度,可以绘制完整的椭圆或一部分椭圆弧

添加文本

putText(img, text, org, fontFace, fontScale, color, thickness)
  • text:输出到图像中的文字,类型为string,目前只支持英文

  • org:指定文本字符串左上角的起始位置

  • 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 斜体字体
  • fontScale:字体的大小,类型为 double

  • color:字体颜色,类型为 Scalar

示例代码

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat_<Vec3b> img = imread("/home/kslas/OpenCV/sample.jpg");
    imshow("Original Image", img);

    /* Draw the image from point A to B */
    Mat_<Vec3b> line_image = img.clone();
    Point pointA(200,80);
    Point pointB(450,80);
    line(line_image, pointA, pointB, Scalar(255, 255, 0), 3);
    imshow("Line on Image", line_image);

    /* Draw a circle using the circle() Function */
    Mat_<Vec3b> circle_image = img.clone();
    // define the center of circle
    Point circle_center(415,190);
    // define the radius of circle
    int radius = 100;
    circle(circle_image, circle_center, radius, Scalar(0, 0, 255), 3);
    imshow("Circle on Image", circle_image);

    Mat_<Vec3b> Filled_circle_image = img.clone();
    circle(Filled_circle_image, circle_center, radius, Scalar(255, 0, 0), -1);
    imshow("Filled Circle on Image", Filled_circle_image);

    /* Draw a rectangle using the rectangle() function */
    Mat_<Vec3b> rect_image = img.clone();
    // Define the starting and end points for the rectangle
    Point start_point(300,115);
    Point end_point(475,225);
    rectangle(rect_image, start_point, end_point, Scalar(0,0,255), 3);
    imshow("Rectangle on Image", rect_image);

    /* Draw an ellipse using the ellipse() function */
    Mat_<Vec3b> imageEllipse = img.clone();
    // define the center point of ellipse
    Point ellipse_center(415,190);
    // define the major and minor axes of the ellipse
    Point axis1(100, 50);
    Point axis2(125, 50);
    //Horizontal
    ellipse(imageEllipse, ellipse_center, axis1, 0, 0, 360, Scalar(255, 0, 0), 3);
    // Vertical
    ellipse(imageEllipse, ellipse_center, axis2, 90, 0, 360, Scalar(0, 0, 255), 3);
    imshow("Ellipses on Image", imageEllipse);

    /* draw the Half Ellipse, just the outline */
    Mat_<Vec3b> halfEllipse = img.clone();
    ellipse(halfEllipse, ellipse_center, axis1, 0, 180, 360, Scalar(255, 0, 0), 3);
    // if you want to draw a Filled ellipse, use this line of code
    ellipse(halfEllipse, ellipse_center, axis1, 0, 0, 180, Scalar(0, 0, 255), -2);
    imshow("Half-Ellipses on Image", halfEllipse);

    /* Write text using putText() function */
    Mat_<Vec3b> imageText = img.clone();
    putText(imageText, "I am a Happy dog!", Point(50,350), FONT_HERSHEY_COMPLEX, 1.5, Scalar(250,225,100));
    imshow("Text on Image", imageText);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

运行结果:

posted @ 2022-01-24 15:28  TNTksals  阅读(138)  评论(0编辑  收藏  举报