OpenCV入门(8):基本操作之绘制基本图形和文本

OpenCV 是一个强大的图像处理库,可以轻松实现图形绘制功能。本文将通过代码示例,介绍如何使用 OpenCV 在图像上绘制常见的图形,包括直线、矩形、圆形、椭圆、多边形以及绘制字体。

一、绘制直线

API:

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
                     int thickness = 1, int lineType = LINE_8, int shift = 0);

参数说明:

  • image:目标图像。
  • pt1:线段起点,格式为 (x, y)。
  • pt2:线段终点,格式为 (x, y)。
  • color:线条颜色,格式为 (B, G, R)。
  • thickness:线条的粗细,默认值为 1。

代码示例:

#include <QApplication>
#include <QDebug>

// 添加相关头文件和包
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建一个全黑的空白图像
    cv::Mat image = cv::Mat::zeros(cv::Size(400, 400), CV_8UC3);

    // 绘制一条白色的直线
    cv::line(image, cv::Point2f(50, 50), cv::Point2f(350, 350), cv::Scalar(255, 255, 255), 2);

    // 显示图像
    cv::imshow("Line", image);
    cv::waitKey(0);

    // 释放资源
    cv::destroyAllWindows();

    return a.exec();
}

运行结果:

Blog_OpenCV_Learnl_14.png


二、绘制矩形

API:

void rectangle(InputOutputArray img, Point pt1, Point pt2,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);

参数说明:

  • image:目标图像。
  • pt1:矩形左上角坐标 (x, y)。
  • pt2:矩形右下角坐标 (x, y)。
  • thickness:正值表示矩形边框的粗细,负值表示填充整个矩形。

代码示例:

#include <QApplication>
#include <QDebug>

// 添加相关头文件和包
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建一个全黑的空白图像
    cv::Mat image = cv::Mat::zeros(cv::Size(400, 400), CV_8UC3);

    // 绘制一个绿色矩形
    cv::rectangle(image, cv::Point2f(100, 100), cv::Point2f(300, 200), cv::Scalar(0, 255, 0), 3);

    // 显示图像
    cv::imshow("Rectangle", image);
    cv::waitKey(0);

    // 释放资源
    cv::destroyAllWindows();

    return a.exec();
}

运行结果:

Blog_OpenCV_Learnl_15.png


三、绘制圆

API:

void circle(InputOutputArray img, Point center, int radius,
                       const Scalar& color, int thickness = 1,
                       int lineType = LINE_8, int shift = 0);

参数说明:

  • image:目标图像。

  • center:圆心坐标 (x, y)。

  • radius:圆的半径。

  • thickness: 正值 - 圆的边框粗细,负值 - 填充整个圆。

代码示例:

#include <QApplication>
#include <QDebug>

// 添加相关头文件和包
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建一个全黑的空白图像
    cv::Mat image = cv::Mat::zeros(cv::Size(400, 400), CV_8UC3);

    // 绘制一个蓝色圆
    cv::circle(image, cv::Point2f(200, 200), 50, cv::Scalar(255, 0, 0), 3);

    // 显示图像
    cv::imshow("Circle", image);
    cv::waitKey(0);

    // 释放资源
    cv::destroyAllWindows();

    return a.exec();
}

运行结果:

Blog_OpenCV_Learnl_16.png


四、绘制椭圆

API:

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);

参数说明:

  • image:目标图像。

  • center:椭圆中心点 (x, y)。

  • axes:椭圆的长轴和短轴长度 (major_axis, minor_axis)。

  • angle:椭圆的旋转角度(以度为单位)。

  • startAngleendAngle:椭圆弧的起始和终止角度。

  • thickness:正值 - 椭圆边框粗细,负值 - 填充整个椭圆。

代码示例:

#include <QApplication>
#include <QDebug>

// 添加相关头文件和包
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建一个全黑的空白图像
    cv::Mat image = cv::Mat::zeros(cv::Size(400, 400), CV_8UC3);

    // 绘制一个红色椭圆
    cv::ellipse(image, cv::Point2f(200, 200), cv::Size(100, 50), 45, 0, 360, cv::Scalar(0, 0, 255), 2);

    // 显示图像
    cv::imshow("Ellipse", image);
    cv::waitKey(0);

    // 释放资源
    cv::destroyAllWindows();

    return a.exec();
}

运行结果:

Blog_OpenCV_Learnl_17.png


五、绘制多边形

API:

void fillPoly(InputOutputArray img, InputArrayOfArrays pts,
                           const Scalar& color, int lineType = LINE_8, int shift = 0,
                           Point offset = Point() );

参数说明:

  • image:目标图像。

  • pts:多边形顶点的数组指针,可以使用二维数组或 vector 来表示。每个多边形都由一组点组成。

  • color:填充的颜色,可以是 Scalar 类型表示的颜色值。

  • lineType:线条类型,定义了多边形轮廓的连接方式。默认值为LINE_8。

  • shift:坐标点的小数位数。默认值为0。

  • offset:偏移量,添加到所有顶点的坐标中。默认情况下为 Point(),表示没有偏移。

代码示例:

#include <QApplication>
#include <QDebug>

// 添加相关头文件和包
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建一个全黑的空白图像
    cv::Mat image = cv::Mat::zeros(cv::Size(400, 400), CV_8UC3);

    // 定义3个多边形顶点
    std::vector<cv::Point> points1 = { cv::Point(50, 50), cv::Point(200, 100), cv::Point(150, 200) };
    std::vector<cv::Point> points2 = { cv::Point(250, 250), cv::Point(350, 300), cv::Point(300, 150) };
    std::vector<cv::Point> points3 = { cv::Point(100, 200), cv::Point(200, 300), cv::Point(150, 350) };
    // 添加到vector中
    std::vector<std::vector<cv::Point>> polygons;
    polygons.push_back(points1);
    polygons.push_back(points2);
    polygons.push_back(points3);

    // 绘制多边形
    cv::fillPoly(image, polygons, cv::Scalar(255, 255, 0));

    // 显示图像
    cv::imshow("Polygon", image);
    cv::waitKey(0);

    // 释放资源
    cv::destroyAllWindows();

    return a.exec();
}

运行结果:

Blog_OpenCV_Learnl_18.png


六、绘制字体

API:

CV_EXPORTS_W 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 );

参数说明:

  • text:要绘制的字符串。
  • org:文本的左下角坐标 (x, y)。
  • fontFace:字体类型,常用值包括:
  • cv::FONT_HERSHEY_SIMPLEX:普通字体。
  • cv::FONT_HERSHEY_COMPLEX:复杂字体。
  • fontScale:字体的缩放比例。
  • thickness:字体的粗细。
  • lineType:线条类型(如 cv::LINE_AA 表示抗锯齿线条)。

代码示例:

#include <QApplication>
#include <QDebug>

// 添加相关头文件和包
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建一个全黑的空白图像
    cv::Mat image = cv::Mat::zeros(cv::Size(400, 400), CV_8UC3);

    // 绘制文本
    cv::putText(image, "OpenCV Hello World", cv::Point(50, 200), cv::FONT_HERSHEY_SIMPLEX,
                1, cv::Scalar(255, 255, 255), 2, cv::LINE_AA);


    // 显示图像
    cv::imshow("Text", image);
    cv::waitKey(0);

    // 释放资源
    cv::destroyAllWindows();

    return a.exec();
}

运行结果:

Blog_OpenCV_Learnl_19.png


posted @ 2025-07-23 10:02  fengMisaka  阅读(97)  评论(0)    收藏  举报