[OpenCV] 数字图像处理 C++ 学习——06绘制形状与文字 附完整代码(小白入门篇)
前言
在图像处理中,绘制几何形状和文字是非常常见的操作。OpenCV 提供了一系列函数,如 cv::line
、cv::rectangle
、cv::circle
和 cv::putText
,可以方便地在图像上绘制各种形状和文字。本篇博客将介绍如何使用 OpenCV 中的 cv::Point
和 cv::Scalar
等类来绘制线、矩形、圆、椭圆等几何形状,以及如何在图片上绘制文本。
1.理论基础
(1)绘制几何形状
-
cv::Point:用于定义图像中的坐标点,
cv::Point(x, y)
表示点的横坐标和纵坐标。 -
cv::Scalar:用于定义颜色,
cv::Scalar(b, g, r)
分别表示蓝、绿、红三个通道的值。OpenCV 提供了多种函数来绘制几何形状:
-
线:使用
cv::line()
函数绘制线段。 -
矩形:使用
cv::rectangle()
函数绘制矩形。 -
圆:使用
cv::circle()
函数绘制圆形。 -
椭圆:使用
cv::ellipse()
函数绘制椭圆。
(2)绘制文本
cv::putText() 函数来在图像上绘制文本,支持指定字体、大小、颜色和位置等。
2.代码实现
图像读取(cv::imread())
换一张唯美的图片来学习实验图片下载链接
先读取图像用于后面的操作
图像读取、展示和保存前面章节有介绍[OpenCV] 数字图像处理 C++ 学习——01图像的读取、加载和保存附完整代码(小白入门篇)-CSDN博客
cv::Mat image;
image = imread("beautifulgirl.jpg"); //读取图像
//复制原图,后续使用
cv::Mat image1 = image.clone();
cv::Mat image2 = image.clone();
cv::Mat image3 = image.clone();
cv::Mat image4 = image.clone();
cv::Mat image5 = image.clone();
if (image.empty()) {
printf("could not find the image...\n");
return;
}
cv::imshow("beautifulgirl", image);
(1)绘制线段(cv::line())
在图像上绘制一条线段是最基本的操作之一。通过设置起点和终点的坐标,以及线条的颜色和粗细,我们可以轻松地在图像上绘制直线。
//绘制线段 cv::line
cv::Point start(50, 50); //起始位置
cv::Point end(350, 350); //结束位置
cv::Scalar lineColor(255, 0, 0); //蓝色
cv::line(image1, start, end, lineColor, 2); //绘制线段
cv::imshow("draw line", image1);
result
(2)绘制矩形(cv::rectangle())
绘制矩形在图像处理中非常实用,尤其是在需要标注特定区域时。我们可以通过定义矩形的左上角和右下角的坐标,并指定颜色和边框宽度来绘制矩形。
//绘制矩形 cv::rectangle
cv::Point topLeft(60, 60); // 矩形左上角
cv::Point bottomRight(400, 400); // 矩形右下角
cv::Scalar rectColor(0, 255, 0); //绿色
cv::rectangle(image2, topLeft, bottomRight, rectColor, 2); // 绘制矩形,边框宽度为2
cv::imshow("draw rectangle", image2);
result
(3)绘制圆形(cv::circle())
绘制圆形可以用于突出图像中的特定点,或者创建图形标记。通过定义圆心坐标、半径以及颜色和边框宽度,可以在图像上绘制一个圆形。
//绘制圆形 cv::circle
cv::Point center(200, 200); // 圆心
int radius = 100; // 半径
cv::Scalar circleColor(0, 0, 255); // 红色
cv::circle(image3, center, radius, circleColor, 2); // 绘制圆形,边框宽度为2
cv::imshow("draw circle", image3);
result
(4)绘制椭圆(cv::ellipse())
椭圆是比圆形更加灵活的几何形状,适用于标注不规则区域。可以通过设置椭圆的中心、轴的长度、旋转角度以及颜色来绘制椭圆。
//绘制椭圆
cv::Point ellipseCenter(200, 200); // 椭圆中心
cv::Size axes(150, 100); // 长轴和短轴
cv::Scalar ellipseColor(255, 255, 0); // 黄色
// 绘制椭圆,椭圆的旋转角度为45度,绘制范围为0到360度
cv::ellipse(image4, ellipseCenter, axes, 45, 0, 360, ellipseColor, 2);
cv::imshow("draw ellipse", image4);
result
(5)绘制文本(cv::putText())
OpenCV 提供的 cv::putText()
函数允许我们指定文本内容、位置、字体、大小、颜色和粗细,轻松地将文本绘制到图像上。
//绘制文本
std::string text = "Hello,beautiful girl!";
cv::Point textOrg(100, 100); // 文本起点
cv::Scalar textColor(0, 0, 255); // 红色
int fontFace = cv::FONT_HERSHEY_SIMPLEX; // 字体
double fontScale = 1.0; // 字体大小
int thickness = 2; // 字体粗细
cv::putText(image5, text, textOrg, fontFace, fontScale, textColor, thickness);
cv::imshow("draw putText", image5);
result
完整代码
#include<opencv2/opencv.hpp>
#include<highgui.hpp>
using namespace cv;
using namespace std;
void Draw_shapes_and_text()
{
cv::Mat image;
image = imread("beautifulgirl.jpg"); //读取图像
//复制原图,后续使用
cv::Mat image1 = image.clone();
cv::Mat image2 = image.clone();
cv::Mat image3 = image.clone();
cv::Mat image4 = image.clone();
cv::Mat image5 = image.clone();
if (image.empty()) {
printf("could not find the image...\n");
return;
}
cv::imshow("beautifulgirl", image);
//绘制线段 cv::line
cv::Point start(50, 50); //起始位置
cv::Point end(350, 350); //结束位置
cv::Scalar lineColor(255, 0, 0); //蓝色
cv::line(image1, start, end, lineColor, 2); //绘制线段
cv::imshow("draw line", image1);
//绘制矩形 cv::rectangle
cv::Point topLeft(60, 60); // 矩形左上角
cv::Point bottomRight(400, 400); // 矩形右下角
cv::Scalar rectColor(0, 255, 0); //绿色
cv::rectangle(image2, topLeft, bottomRight, rectColor, 2); // 绘制矩形,边框宽度为2
cv::imshow("draw rectangle", image2);
//绘制圆形 cv::circle
cv::Point center(200, 200); // 圆心
int radius = 100; // 半径
cv::Scalar circleColor(0, 0, 255); // 红色
cv::circle(image3, center, radius, circleColor, 2); // 绘制圆形,边框宽度为2
cv::imshow("draw circle", image3);
//绘制椭圆
cv::Point ellipseCenter(200, 200); // 椭圆中心
cv::Size axes(150, 100); // 长轴和短轴
cv::Scalar ellipseColor(255, 255, 0); // 黄色
cv::ellipse(image4, ellipseCenter, axes, 45, 0, 360, ellipseColor, 2); // 绘制椭圆,椭圆的旋转角度为45度,绘制范围为0到360度
cv::imshow("draw ellipse", image4);
//绘制文本
std::string text = "Hello,beautiful girl!";
cv::Point textOrg(100, 100); // 文本起点
cv::Scalar textColor(0, 0, 255); // 红色
int fontFace = cv::FONT_HERSHEY_SIMPLEX; // 字体
double fontScale = 1.0; // 字体大小
int thickness = 2; // 字体粗细
cv::putText(image5, text, textOrg, fontFace, fontScale, textColor, thickness);
cv::imshow("draw putText", image5);
cv::waitKey(0);
}
int main()
{
Draw_shapes_and_text();
return 0;
}
总结
希望这篇文章能帮助大家更好地掌握 OpenCV C++ 的基础操作。通过这些简单的形状和文字绘制示例,可以熟悉 OpenCV 的基本功能,为以后处理更复杂的图像任务打下基础。建议初学者在学习过程中,尽量自己动手敲代码,这样比单纯复制粘贴更能加深理解和记忆。