opencv在图像上绘制各种几何形状(直线,矩形,圆,椭圆等)、文本和曲线


使用 OpenCV 新建一张透明图片,在图片里绘制一条直线、一个矩形、一个圆、一个椭圆、一段文字;

OpenCV 绘制图像的一些应用:

  • 图像标注:在图像上添加标注或者注释,例如在目标检测或者图像分类任务中,通过在图像上绘制框、标签等信息来标记检测到的目标;
  • 处理后显示:例如在图像处理过程中,可以在处理前和处理后的图像上绘制对比图,直观地显示图像处理的效果;
  • 实时显示:通过持续不断地在屏幕上绘画来实现,实时显示效果,例如在视频处理中输出处理后的视频流并将其实实时渲染在屏幕上;

cv::Mat 是 OpenCV 中表示图像的数据结构,它可以存储多通道的图像;

cv::Scalar 是一个四通道的实数向量,用于表示像素点的颜色和 alpha 值;

cv::Point 是一个二维整型向量,用于表示像素点的坐标;

cv::Size(width, height) size类中的两个数据成员叫做width和height;

cv::ones():相当于每个像素的第一个通道为1,其余两个通道为0,Scalar(1,0,0)

cv::zeros():相当于创建一张黑色的图,每个像素的每个通道都为0,Scalar(0,0,0)

cv::line 函数用于在图片上绘制直线;

cv::rectangle 函数用于在图片上绘制矩形

cv::circle 函数用于在图片上绘制圆

cv::ellipse 函数用于在图片上绘制椭圆

cv::putText 函数用于在图片上绘制文本

函数功能介绍:

一、绘制直线:

1、line() 函数:用于在图片上绘制直线;
(1)函数原型:
void cv::line( InputOutputArray img, 
	       Point pt1, 
	       Point pt2, 
               const Scalar& color,
               int thickness = 1, 
               LineTypes lineType = LINE_8, 
               int shift = 0 );
参数解释:
img:输入输出参数,表示待绘制的目标图像;
pt1: 输入参数,表示的是直线的起点坐标(是一个 cv::Point 类型的对象);
pt2: 输入参数,表示的是直线的终点坐标(是一个 cv::Point 类型的对象);
color: 输入参数,表示绘制直线的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness: 可选参数,表示绘制直线线条的宽度:(
	默认值为1,表示绘制一个线条宽度为1像素的直线;
	如果设置为负值,则表示绘制一条填充直线;)
lineType:可选参数,表示绘制直线的类型,可以取以下几个值:( 
	cv::LINE_4,默认值,表示绘制一条 4 连通的直线;
	cv::LINE_8: 表示绘制一条 8 连通的直线;
	cv::LINE_AA: 表示绘制一条抗锯齿的直线;)
shift:可选参数,坐标点的小数点位数,默认为 0
(2)示例代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
    
    

	// 创建一张大小为 512x512,具有 alpha 通道的透明图片
	cv::Mat img( 512, 512, CV_8UC4, cv::Scalar(0, 0, 0, 0) );
	// 在图片上绘制一条直线
	cv::line( img, cv::Point(300, 100), cv::Point(450, 100), cv::Scalar(0, 255, 0, 255), 3 );
	// 显示图片
	imshow("img", img);

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

二、绘制矩形,需要先使用Rect()类初始化一个矩形,再使用rectangle()函数绘制这个矩形;

1、Rect()矩形类

Rect()矩形类,主要作用是初始化一个矩形,然后使用 rectangle()函数绘制这个矩形;

构造函数:
Rect rect(int x, int y, int width, int height);
// 初始化Rect()矩形类
Rect rect(100, 50, 50, 100);

创建矩形对象的构造函数有四个参数,左上角的坐标(x,y)和矩阵的宽度和高度
Rect类的成员函数:

(1)rect.size() 和 rect.area() 和 rect.width() 和 rect.height(),用来描述矩形的宽度,高度,尺寸和面积;

  • rect.width() // 返回rect的宽度 50
  • rect.height() // 返回rect的高度 100
  • rect.size() // 返回rect的尺寸 [50 × 100]
  • rect.area() // 返回rect的面积 5000

(2)br() 和 tl(),用来描述矩形坐标点的

  • rect.br() // 返回rect的右下角顶点的坐标 [150, 150]
  • rect.tl() // 返回rect的左上角顶点的坐标 [100, 50]

(3)rect.contains(Point(x, y)) 和 rect.inside(Point(x, y)),用来判断点是否在矩形中,返回值都是bool类型

  • rect.contains(Point(x, y)) // 判断rect是否包含Point(x, y)点,两个函数用法相同
  • rect.inside(Point(x, y)) // 判断rect是否包含Point(x, y)点,两个函数用法相同

(4)对矩形进行比较,返回布尔变量

  • rect1 == rect2
  • rect1 != rect2

(5)对矩形进行平移和缩放:

Rect类可以通过简单的与一个Point类型变量相加实现矩形平移,以及与一个Size类型变量相加实现矩形的放缩

  • rect = rect + Point(-100, 100); // 平移,也就是左上顶点的x坐标-100,y坐标+100
  • rect = rect + Size(-100, 100); // 缩放,左上顶点不变,宽度-100,高度+100

(6)扩展

1、OpenCV里没有判断rect1是否在rect2里面的功能,所以自己写一个 
bool isInside(Rect rect1, Rect rect2)  
{
    
      
    return (rect1 == (rect1&rect2));  
}  

2、OpenCV没有获取矩形中心点的功能,自己写一个  
Point getCenterPoint(Rect rect)  
{
    
      
    Point cpt;  
    cpt.x = rect.x + cvRound(rect.width/2.0);  
    cpt.y = rect.y + cvRound(rect.height/2.0);  
    return cpt;  
}  
  
3、围绕矩形中心缩放函数  
Rect rectCenterScale(Rect rect, Size size)  
{
    
      
    rect = rect + size;   
    Point pt;  
    pt.x = cvRound(size.width/2.0);  
    pt.y = cvRound(size.height/2.0);  
    return (rect-pt);  
}  

(7)矩形运算,求两个矩形的交集和并集

  • rect = rect1 & rect2
  • rect = rect1 | rect2
Mat m1 = imread("1.jpg");
Mat m2 = imread("1.jpg");
Rect rect1(0,0,300,300);
Rect rect2(0, 0, 100, 100);
Scalar s(255, 255, 0);

Rect rt1 = rect1 & rect2; //取并集
rectangle(m1, rt1, s);
Rect rt2 = rect1 | rect2; //取交集
rectangle(m2, rt2, s);
imshow("交集", m1);
imshow("并集", m2);
2、rectangle() 函数

rectangle()函数的主要作用是给图像的指定区域加上矩形边框,通常用在图片的标记上,使图像处理的目标区域可视化,便于我们对目标区域的处理;

(1)函数原型1:
void rectangle( InputOutputArray img,
	 	Rect 	rect,
		const 	Scalar &color,
		int 	thickness = 1,
		int 	lineType = LINE_8,
		int 	shift = 0 )

参数解释:
img:输入输出参数,表示待绘制的目标图像;
rect:输入参数,使用Rect()定义的矩形;
color: 输入参数,表示绘制矩形的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness:可选参数,表示矩形边框的宽度:(
	默认值为1,表示绘制矩形的边框线条宽度为1像素;;
	thickness小于0表示绘制一个填充矩形,即一个实心矩形;
	thickness小于0表示绘制一个矩形框,矩形边框的宽度为thickness的值;)
lineType:可选参数,表示矩形边框的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的矩形边框,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的矩形边框;
	cv::LINE_AA: 表示绘制抗锯齿的矩形边框;)
shift:可选参数,坐标点的小数点位数,默认为 0

示例代码:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
    
    

	// 创建一张大小为 512x512,具有 alpha 通道的透明图片
	cv::Mat img(512, 512, CV_8UC4, cv::Scalar(0, 0, 0, 0));
	// 初始化一个矩形A
	cv::Rect rectA;
	rectA.x = 100;
	rectA.y = 100;
	rectA.width = 100;
	rectA.height = 100;
	// thickness小于0表示绘制一个填充矩形,即一个实心矩形
	cv::rectangle(img, rectA, Scalar(0, 255, 0), -1);

	// 初始化一个矩形B
	cv::Rect rectB;
	rectB.x = 300;
	rectB.y = 300;
	rectB.width = 100;
	rectB.height = 100;
	// thickness大于0表示绘制一个矩形框
	cv::rectangle(img, rectB, Scalar(0, 0, 255), 2);


	// 显示图片
	imshow("img", img);

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

(2)函数原型2:
void rectangle( InputOutputArray img,
		Point(i, j) pt1, 
		Point(i+img.cols, j+img.rows) pt2,
                const Scalar &color, 
		int thickness = 1,
                int lineType = LINE_8, 
		int shift = 0 );

参数解释:
img:输入输出参数,表示待绘制的目标图像;
pt1:矩形左上角顶点的坐标;
pt2:矩形对角线上,右下角顶点的坐标;
color: 输入参数,表示绘制矩形的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness:可选参数,表示矩形边框的宽度:(
	默认值为1,表示绘制矩形的边框线条宽度为1像素;
	thickness小于0表示绘制一个填充矩形,即一个实心矩形;
	thickness大于0表示绘制一个矩形框,矩形边框的宽度为thickness的值;)
lineType:可选参数,表示矩形边框的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的矩形边框,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的矩形边框;
	cv::LINE_AA: 表示绘制抗锯齿的矩形边框;)
shift:可选参数,坐标点的小数点位数,默认为 0

示例代码:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
    
    

	// 创建一张大小为 512x512,具有 alpha 通道的透明图片
	cv::Mat img(512, 512, CV_8UC4, cv::Scalar(0, 0, 0, 0));
	// thickness小于0表示绘制一个填充矩形,即一个实心矩形
	cv::rectangle(img, cv::Point(100, 100), cv::Point(200, 200), cv::Scalar(0, 255, 0, 255), -1);
	// thickness大于0表示绘制一个矩形框
	cv::rectangle(img, cv::Point(300, 300), cv::Point(400, 400), cv::Scalar(0, 0, 255, 255), 2);
	// 显示图片
	imshow("img", img);

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

在这里插入图片描述

三、绘制圆

1、circle() 函数:用于在图片上绘制圆;
(1)函数原型:
void cv::circle( InputOutputArray img, 
		 Point center, 
		 int radius, 
		 const Scalar &color,
                 int thickness = 1, 
		 LineTypes lineType = LINE_8, 
                 int shift = 0 );

参数解释:
img:输入输出参数,表示待绘制的目标图像;
center:输入参数,表示圆心坐标(是一个 cv::Point 类型的对象);
radius:输入参数,表示圆的半径;
color: 输入参数,表示绘制圆的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness:可选参数,表示圆形边框的宽度:(
	默认值为1,表示绘制圆的边框线条宽度为1像素;
	thickness小于0表示绘制一个填充圆,即一个实心圆;
	thickness大于0表示绘制一个圆形框,圆形边框的宽度为thickness的值;)
lineType:可选参数,表示圆形边框的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的圆边界,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的圆边界;
	cv::LINE_AA: 表示绘制抗锯齿的圆边界;)
shift:可选参数,坐标点的小数点位数,默认为 0
(2)示例代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;


int main() {
    
    

	// 创建一张大小为 512x512,具有 alpha 通道的透明图片
	cv::Mat img(512, 512, CV_8UC4, cv::Scalar(0, 0, 0, 0));

	// thickness小于0表示绘制一个填充圆,即一个实心圆
	cv::circle(img, cv::Point(100, 100), 50, cv::Scalar(0, 255, 0, 255), -1);

	// thickness大于0表示绘制一个圆形框
	cv::circle(img, cv::Point(200, 200), 50, cv::Scalar(0, 0, 255, 255), 1);
	// 显示图片
	imshow("img", img);

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

四、绘制椭圆

1、ellipse() 函数:用于在图片上绘制椭圆;
(1)函数原型:
void cv::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
)

参数解释:
img:输入输出参数,表示待绘制的目标图像;
center:输入参数,表示椭圆中心点坐标(是一个 cv::Point 类型的对象);
axes:输入参数,椭圆的长轴和短轴,是一个 cv::Size(width, height) 类型的对象;
angle:输入参数,绘制出的椭圆沿水平方向旋转的角度,举个例子(
	0   -> 水平,不旋转
	60  -> 水平防线旋转60)
startAngle:输入参数,开始绘制角度,与endAngle搭配使用,可以决定椭圆绘制的方向,举个例子(
	0   ->0度开始绘制,到endAngle结束绘制;
	360  ->360度开始绘制,到endAngle结束绘制;
)
endAngle:输入参数,结束绘制角度,与startAngle搭配使用,可以决定椭圆绘制的方向,举个例子(
	0   -> 从startAngle开始绘制,绘制到0度结束绘制;
	360  -> 从startAngle开始绘制,绘制到360度结束绘制;
)
color: 输入参数,表示绘制椭圆的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness:可选参数,表示椭圆形边框的宽度:(
	默认值为1,表示绘制椭圆形的边框线条宽度为1像素;
	thickness小于0表示绘制一个填充椭圆,即一个实心椭圆;
	thickness大于0表示绘制一个椭圆形框,圆形边框的宽度为thickness的值;)
lineType:可选参数,表示椭圆形边框的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的椭圆边界,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的椭圆边界;
	cv::LINE_AA: 表示绘制抗锯齿的椭圆边界;)
shift:可选参数,坐标点的小数点位数,默认为 0
(2)示例代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
    
    

	// 创建一张大小为 512x512,具有 alpha 通道的透明图片
	cv::Mat img(512, 512, CV_8UC4, cv::Scalar(0, 0, 0, 0));

	// thickness小于0表示绘制一个填充圆,即一个实心圆
	ellipse(img, Point(100, 100), Size(60, 30), 0, 0, 360, Scalar(0, 0, 255), -1, LINE_8);

	// thickness大于0表示绘制一个圆形框
	ellipse(img, Point(200, 200), Size(60, 30), 0, 0, 360, Scalar(0, 0, 255), 1, LINE_8);

	// angle=90,绘制出的椭圆沿水平方向旋转90度
	ellipse(img, Point(300, 300), Size(60, 30), 90, 0, 360, Scalar(0, 0, 255), -1, LINE_8);

	// startAngle=0,endAngle=180,逆时针开始绘制椭圆,绘制180度,结束绘制
	ellipse(img, Point(400, 400), Size(60, 30), 0, 0, 180, Scalar(0, 0, 255), -1, LINE_8);

	// startAngle=360,endAngle=180,顺时针开始绘制椭圆,绘制180度,结束绘制
	ellipse(img, Point(400, 500), Size(60, 30), 0, 360, 180, Scalar(0, 0, 255), -1, LINE_8);

	// 显示图片
	imshow("img", img);

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

五、绘制与填充多边形

1、polylines():只能绘制一个多边形框

opencv中支持常见的点、线、圆、椭圆与矩形的绘制与填充都是通过设置thickness这个参数来实现绘制与填充,当thickness是正数的时就会绘制;当thickness为非正数时就会填充;

但是对多边形来说,polylines()函数把thickness设置为非正数就会直接报错,无法通过修改thickness完成填充,该函数只能绘制一个多边形框;

(1)函数原型:
void cv::polylines(
         InputOutputArray      img,
         InputArrayOfArrays    pts,
         bool                  isClosed,
         const Scalar          &color,
         int                   thickness = 1,
         int                   lineType = LINE_8,
         int                   shift = 0
)

参数解释:
img:输入输出参数,表示待绘制的目标图像;
pts:输入参数,表示多边形的顶点坐标集合(是一个 std::vector<Point> pts 类型的对象);
isClosed:表示是否闭合,默认闭合;
color: 输入参数,表示绘制多边形的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness:可选参数,表示多边形边框的宽度,polylines()函数的thickness必须是正数;
lineType:可选参数,表示多边形边框的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的多边形边界,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的多边形边界;
	cv::LINE_AA: 表示绘制抗锯齿的多边形边界;)
shift:可选参数,坐标点的小数点位数,默认为 0
(2)示例代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;


int main() {
    
    

	// 创建一张大小为 512x512,3通道的图片
	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
	int w = canvas.cols;
	int h = canvas.rows;
	Point p1(100, 100);
	Point p2(300, 150);
	Point p3(300, 350);
	Point p4(250, 450);
	Point p5(50, 450);
	std::vector<Point> pts;
	pts.push_back(p1);
	pts.push_back(p2);
	pts.push_back(p3);
	pts.push_back(p3);
	pts.push_back(p4);
	pts.push_back(p5);
	// 绘制多边形
	polylines(canvas, pts, true, Scalar(0, 255, 0), 1, 8, 0);

	// 显示图片
	imshow("canvas", canvas);

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

2、fillPoly():只能绘制一个填充多边形,即一个实心多边形;

fillPoly() 函数:该没有thickness跟isClose参数,该函数只能绘制一个填充多边形,即一个实心多边形;

(1)函数原型:
void cv::fillPoly(   
         InputOutputArray      img,
         InputArrayOfArrays    pts,
         const Scalar 	       &color,
         int                   lineType = LINE_8,
         int                   shift = 0,
)

参数解释:
img:输入输出参数,表示待绘制的目标图像;
pts:输入参数,表示多边形的顶点坐标集合(是一个 std::vector<Point> pts 类型的对象);
color: 输入参数,表示绘制多边形的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
lineType:可选参数,表示多边形边框的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的多边形边界,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的多边形边界;
	cv::LINE_AA: 表示绘制抗锯齿的多边形边界;)
shift:可选参数,坐标点的小数点位数,默认为 0
(2)示例代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
    
    

	// 创建一张大小为 512x512,3通道的图片
	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
	int w = canvas.cols;
	int h = canvas.rows;
	Point p1(100, 100);
	Point p2(300, 150);
	Point p3(300, 350);
	Point p4(250, 450);
	Point p5(50, 450);
	std::vector<Point> pts;
	pts.push_back(p1);
	pts.push_back(p2);
	pts.push_back(p3);
	pts.push_back(p3);
	pts.push_back(p4);
	pts.push_back(p5);

	// 绘制一个多边形框
	//polylines(canvas, pts, true, Scalar(0, 255, 255), 1, LINE_8, 0);
	// 绘制一个实心多边形
	fillPoly(canvas, pts, Scalar(255, 0, 255), LINE_8, 0);

	// 显示图片
	imshow("canvas", canvas);

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

3、drawContours()函数:即能绘制多边形边框,也能绘制实心多边形;
  • 一次可以绘制任意数量的多边形边框,或者实心多边形;
  • 跟点、线、圆、椭圆与矩形的绘制与填充一样,都是通过设置thickness这个参数来实现绘制与填充,当thickness是正数的时就会绘制;当thickness为非正数时就会填充;
(1)函数原型:
 void cv::drawContours (  
     InputOutputArray      image,
     InputArrayOfArrays    contours,
     int                   contourIdx,
     const Scalar          &color,
     int                   thickness = 1,
     int                   lineType = LINE_8,
     InputArray            hierarchy = noArray(),
     int                   maxLevel = INT_MAX
)

参数解释:
image:输入输出参数,表示待绘制的目标图像;
contours:输入参数,contours是个二维嵌套数组,可以存储多个多边形,数组中的元素,存储的是一个个多边形顶点坐标的集合(contours是一个 std::vector<std::vector<Point>> contours 类型的对象);
contourIdx:输入参数,表示绘制指定索引的多边形(contours里是多个集合,绘制哪一个集合,用contourIdx指定;contourIdx大于0表示绘制指定索引的集合,小于0表示绘制全部集合)  
color: 输入参数,表示绘制多边形的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness:可选参数,表示多边形边框的宽度:(
	默认值为1,表示绘制多边形的边框线条宽度为1像素;
	thickness小于0表示绘制一个填充多边形,即一个实心多边形;
	thickness大于0表示绘制一个多边形边框,多边形边框的宽度为thickness的值;)
lineType:可选参数,表示多边形边框的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的多边形边界,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的多边形边界;
	cv::LINE_AA: 表示绘制抗锯齿的多边形边界;)
hierarchy:可选参数,
maxLevel:可选参数,

(2)示例代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
    
    

	// 创建一张大小为 512x512,3通道的图片
	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
	int w = canvas.cols;
	int h = canvas.rows;
	// 第1个多边形
	Point p1(100, 100);
	Point p2(300, 150);
	Point p3(300, 350);
	Point p4(250, 450);
	Point p5(50, 450);
	std::vector<Point> pts1;
	pts1.push_back(p1);
	pts1.push_back(p2);
	pts1.push_back(p3);
	pts1.push_back(p3);
	pts1.push_back(p4);
	pts1.push_back(p5);
	// 第2个多边形
	Point p6(200, 200);
	Point p7(300, 200);
	Point p8(400, 450);
	Point p9(350, 350);
	Point p10(60, 500);
	std::vector<Point> pts2;
	pts2.push_back(p6);
	pts2.push_back(p7);
	pts2.push_back(p8);
	pts2.push_back(p9);
	pts2.push_back(p10);

	std::vector<std::vector<Point>> contours;
	contours.push_back(pts1);
	contours.push_back(pts2);
	// 绘制contours中第1个多边形边框
	drawContours(canvas, contours, 0, Scalar(0, 0, 255), 1, 8);
	// 绘制contours中第2个多边形边框
	drawContours(canvas, contours, 1, Scalar(0, 255, 0), 1, 8);

	// 显示图片
	imshow("canvas", canvas);

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

六、绘制文本

1、putText() 函数用于在图像上绘制文本;
(1)函数原型:
void cv::putText( 
	InputOutputArray img, 
	const String     &text, 
	Point            org, 
        int              fontFace,
        double           fontScale, 
	Scalar           color, 
        int              thickness = 1, 
        int              lineType = LINE_8,
        bool             bottomLeftOrigin = false
)

参数解释:
image:输入输出参数,表示待绘制的目标图像;
text:输入参数,表示要绘制的文本字符串;
org:输入参数,表示文本框左下角的坐标点(是一个 cv::Point 类型的对象);
fontFace:输入参数,表示字体的类型,可以取以下几个值(
	cv::FONT_HERSHEY_COMPLEX:复杂风格字体;
	cv::FONT_HERSHEY_COMPLEX_SMALL:小字号复杂风格字体;
	cv::FONT_HERSHEY_DUPLEX:双线条字体;
	cv::FONT_HERSHEY_PLAIN:单线条字体;
	cv::FONT_HERSHEY_SIMPLEX:正常大小的字体;
	cv::FONT_HERSHEY_TRIPLEX:三线条字体;
)
fontScale:输入参数,表示字体大小缩放比例;
color: 输入参数,表示绘制文本的颜色以及透明度,是一个 cv::Scalar 类型的对象,常见的颜色有(
	红色(0, 0, 255);
	绿色(0, 255, 0);
	蓝色(255, 0, 0)等;)
thickness:可选参数,表示文本轮廓线条的宽度:(
	默认值为1,表示绘制文本轮廓线条宽度为1像素;
	thickness大于0表示绘制文本轮廓线条宽度为thickness的值;小于0表示绘制一个填充文本)
lineType:可选参数,表示文本轮廓线条的类型,可以取以下几个值:(
	cv::LINE_4: 表示绘制四个相邻的点的文本边界,默认值;
	cv::LINE_8: 表示绘制八个相邻的点的文本边界;
	cv::LINE_AA: 表示绘制抗锯齿的文本边界;)
bottomLeftOrigin:可选参数,表示坐标点是否为文本框左下角的坐标点(
	默认值为 false,表示坐标点为文本框左下角的坐标点;
	设置成 true,表示坐标点为文本框左上角的坐标点;
)

(2)示例代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
    
    

	// 创建一张大小为 512x512,3通道的图片
	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
	// 待绘制的文本
	std::string text = "Hello, OpenCV!";
	// 开始绘制文本
	cv::putText(canvas, text, cv::Point(0, 0), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255, 255), 2, LINE_8, true);

	// 显示图片
	imshow("canvas", canvas);

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

猜你喜欢

转载自blog.csdn.net/qq_33867131/article/details/131552307