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();
}
运行结果:

二、绘制矩形
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();
}
运行结果:

三、绘制圆
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();
}
运行结果:

四、绘制椭圆
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:椭圆的旋转角度(以度为单位)。 -
startAngle和endAngle:椭圆弧的起始和终止角度。 -
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();
}
运行结果:

五、绘制多边形
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();
}
运行结果:

六、绘制字体
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();
}
运行结果:


浙公网安备 33010602011771号