[OpenCV] 数字图像处理 C++ 学习——06绘制形状与文字 附完整代码(小白入门篇)

[OpenCV] 数字图像处理 C++ 学习——06绘制形状与文字 附完整代码(小白入门篇)

前言

在图像处理中,绘制几何形状和文字是非常常见的操作。OpenCV 提供了一系列函数,如 cv::linecv::rectanglecv::circlecv::putText,可以方便地在图像上绘制各种形状和文字。本篇博客将介绍如何使用 OpenCV 中的 cv::Pointcv::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 的基本功能,为以后处理更复杂的图像任务打下基础。建议初学者在学习过程中,尽量自己动手敲代码,这样比单纯复制粘贴更能加深理解和记忆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mirror_zAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值