文章目录
使用 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;
}