一、简介
OpenCV库是一个开源计算机视觉库,旨在提供用于人工智能、深度学习、机器人、编程和计算机视觉研究的基本工具。其中,OpenCV putText函数是一个常用的图像处理函数,用于将文本字符串绘制在图像上。
二、函数参数
putText函数有以下参数:
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 //文本字符串的起始绘图位置
);
其中,
- img:表示输入的图像,可以是Mat类型或UMat类型
- text:表示要在图像上绘制的文本字符串
- org:表示绘制文本的位置,是一个二维的坐标值(x,y)
- fontFace:表示字体类型,如FONT_HERSHEY_SIMPLEX、FONT_HERSHEY_PLAIN、FONT_HERSHEY_DUPLEX等
- fontScale:表示字体大小的缩放因子
- color:表示文本字符串的颜色,包括RGB颜色值(例如Scalar(0,255,0)表示绿色,Scalar(255,0,0)表示蓝色等)
- thickness:表示文本字符串的粗细程度(一般为1~10之间的整数,值越大表示越粗的字体)
- lineType:表示线条的类型,常用的有LINE_4、LINE_8、LINE_AA等
- bottomLeftOrigin:表示文本字符串的起始绘图位置,如果为false,则默认以左上角点作为起始位置,如果为true,则以左下角点作为起始位置
三、函数用例
下面给出一些putText函数的用例。
1. 文字水印
在图像上加入文字水印是OpenCV中的常见应用之一,可以有效抵御图片盗用、转载、传播等行为。下面介绍如何在一张图片上加上水印。
cv::Mat image = cv::imread("input.jpg");
std::string text = "By Li Ming";
cv::putText(image, text, cv::Point(50, 50), cv::FONT_HERSHEY_SIMPLEX,1.5,cv::Scalar(0, 0, 255),2,LINE_AA);
cv::imwrite("output.jpg", image);
这段代码中,我们用imread函数读入了一张图片,并定义了水印文本text,使用putText函数在坐标(50, 50)处把文本写入图片中。最后使用imwrite函数把写好水印的图片保存下来。
2. 多行文字
如果需要在一块区域内写入多行文字,可以利用putText函数的高度计算功能来实现,具体做法是先计算出字体的高度,然后依次写入不同的行。
cv::Mat image = cv::imread("input.jpg");
std::string text = "OpenCV\nputText\nFunction";
cv::Scalar textColor = cv::Scalar(0, 0, 255);
double fontScale = 2;
int thickness = 2;
int fontFace = cv::FONT_HERSHEY_SIMPLEX;
int baseline=0;
Size textSize = cv::getTextSize(text, fontFace, fontScale, thickness, &baseline);
Point textOrg((image.cols - textSize.width)/2, (image.rows + textSize.height)/2);
cv::putText(image, text, textOrg, fontFace, fontScale, textColor, thickness);
cv::imwrite("output.jpg", image);
这段代码中,我们定义了一个多行文本字符串,并把它写在了中央位置。先通过getTextSize函数来计算字体高度,计算好之后,再根据图像大小和字体高度来确定文本的绘制位置。这里使用的是cv::FONT_HERSHEY_SIMPLEX字体,字号为2,字体颜色为红色,字体粗细为2px。
3. 文字轮廓
通过调整putText函数的粗细参数,can实现绘制文字轮廓的功能,常用于实现一些炫酷的效果。例如下面的代码片段实现在图像上绘制带有轮廓的文字。
//读入图像
Mat img = imread("input.jpg", IMREAD_COLOR);
//现在在原图像上绘制文字
putText(img, "OpenCV", Point(50, 50), FONT_HERSHEY_SIMPLEX, 2.0, Scalar(0, 255, 0), 3, LINE_AA, false);
//设置输出图像的大小
Size sz1 = img.size();
int h1 = sz1.height;
int w1 = sz1.width;
//初始化新图像
Mat img_new=cv::Mat::zeros(w1, h1, CV_8UC1);
//将原图像转为灰度图像
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
//用Canny函数计算边缘
Canny(gray, img_new, 100, 200, 3);
//显示输出图像
imshow("Output Image", img_new);
waitKey(0);
以上代码首先读入一张彩色图像,然后利用putText函数在图像上绘制文本字符串。接下来,我们将原图像转为灰度图像,并利用Canny函数计算图像边缘。最后将边缘图输出并显示。
4. 色彩变换
putText函数除了可以绘制文字,还可以结合一些颜色变换函数,实现一些炫酷的效果。例如,可以结合applyColorMap函数实现对文字颜色渐变的效果。下面是一段代码示例:
Mat image = imread("input.jpg");
String text = "OpenCV";
int fontFace = cv::FONT_HERSHEY_SIMPLEX;
double fontScale = 2;
int thickness = 2;
int colorMap = cv::COLORMAP_RAINBOW;
int stepSize = 4;
Mat heatMap;
applyColorMap(image, heatMap, colorMap);
cvtColor(heatMap, heatMap, cv::COLOR_BGR2GRAY);
flip(heatMap,heatMap,0);
Mat outputImage = Mat::zeros(image.rows,image.cols,heatMap.type());
putText(outputImage,text,Point(150,150),fontFace,fontScale,Scalar(0,255,0),thickness);
for(int i=0;i<(image.rows)-stepSize;i+=stepSize)
{
for(int j=0;j<(image.cols)-stepSize;j+=stepSize)
{
Rect ROI = Rect(i,j,stepSize,stepSize);
Mat colorROI = heatMap(ROI);
Scalar colour = mean(colorROI);
rectangle(outputImage, Rect(i,j,stepSize,stepSize), colour, -1, 8);
}
}
imshow("Output Image", outputImage);
waitKey(0);
这段代码首先读入一张图像,然后使用applyColorMap函数将图像转化为热度图。接着把热度图转为灰度图,并实现了一个绿色的文本字符串。最后,我们在热度图上按矩形遍历,并根据矩形内像素的平均颜色填充矩形,实现了一个绚丽的色彩效果。
四、结语
OpenCV putText函数可以在图像上绘制出各种风格的文本,对于熟练使用OpenCV的开发者来说非常实用。文章介绍了putText函数的基本用法,也给出了一些实用的代码示例,希望对大家的OpenCV开发工作有所帮助。