OpenCV putText()函数的用法(附带实例)
OpenCV 中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数,用于在图像上绘制文字。这个函数是 putText(),它是命名空间 cv 中的函数,其声明如下:
常用的字体宏是 FONT_HERSHEY_SIMPLEX(普通大小无衬线字体)和 FONT_HERSHEY_PLAIN(小号无衬线字体)。任何一个字体都可以和 CV::FONT_ITALIC 组合使用(通过“或”操作,或操作符号是|)来得到斜体。每种字体都有一个“自然”大小,当 fontScale 不是 1.0 时,在文字绘制之前字体大小将由这个数来缩放。
这里解释一下衬线。衬线指的是字母结构笔画之外的装饰性笔画。有衬线的字体叫衬线体(Serif),没有衬线的字体叫无衬线体(Sans-Serif)。
衬线体的特征是在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。衬线体很容易识别,它强调了每个字母笔画的开始和结束,因此易读性比较高。中文字体中的宋体就是一种标准的衬线体。
无衬线体(Sans-Serif Font)没有额外的装饰,而且笔画的粗细差不多。这类字体通常是机械的和统一线条的,它们往往拥有相同的曲率、笔直的线条和锐利的转角。无衬线体与汉字字体中的黑体相对应。
另外,在实际绘制文字之前,还可以使用 cv::getTextSize() 接口先获取待绘制文本框的大小,以方便放置文本框。getTextSize() 函数可以获取字符串的宽度和高度,该函数声明如下:
函数返回值中包含文本框的大小。
【实例】绘制文字。
1) 新建一个控制台工程,工程名是 test。
2) 打开 main.cpp,输入如下代码:
3) 保存工程并运行,结果如下图所示:
void cv::putText(
cv::Mat& img, // 待绘制的图像
const string& text, // 待绘制的文字
cv::Point origin, // 文本框的左下角
int fontFace, // 字体(如 cv::FONT_HERSHEY_PLAIN)
double fontScale, // 尺寸因子,值越大,文字就越大
cv::Scalar color, // 线条的颜色(RGB)
int thickness = 1, // 线条宽度
int lineType = 8, // 线型(4 邻域或 8 邻域,默认为 8 邻域)
bool bottomLeftToOrigin = false // true='origin at lower left'
);
这个函数可以简单地在图像上绘制一些文字,由 text 指定的文字将在以左上角为原点的文字框中以 color 指定的颜色绘制出来,除非 bottomLeftOrigin 标志设置为真,这种情况以左下角为原点,使用的字体由 fontFace 参数决定。常用的字体宏是 FONT_HERSHEY_SIMPLEX(普通大小无衬线字体)和 FONT_HERSHEY_PLAIN(小号无衬线字体)。任何一个字体都可以和 CV::FONT_ITALIC 组合使用(通过“或”操作,或操作符号是|)来得到斜体。每种字体都有一个“自然”大小,当 fontScale 不是 1.0 时,在文字绘制之前字体大小将由这个数来缩放。
这里解释一下衬线。衬线指的是字母结构笔画之外的装饰性笔画。有衬线的字体叫衬线体(Serif),没有衬线的字体叫无衬线体(Sans-Serif)。
衬线体的特征是在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。衬线体很容易识别,它强调了每个字母笔画的开始和结束,因此易读性比较高。中文字体中的宋体就是一种标准的衬线体。
无衬线体(Sans-Serif Font)没有额外的装饰,而且笔画的粗细差不多。这类字体通常是机械的和统一线条的,它们往往拥有相同的曲率、笔直的线条和锐利的转角。无衬线体与汉字字体中的黑体相对应。
另外,在实际绘制文字之前,还可以使用 cv::getTextSize() 接口先获取待绘制文本框的大小,以方便放置文本框。getTextSize() 函数可以获取字符串的宽度和高度,该函数声明如下:
Size cv::getTextSize(const string& text,cv::Point origin,int fontFace,double fontScale,int thickness,int* baseLine);各个参数的含义如下:
- text 表示输入的文本文字;
- fontFace 表示文字字体类型;
- fontScale 表示字体缩放系数;
- thickness 表示字体笔画线宽;
- baseLine 是一个输出参数,表示文字最底部的 y 坐标。
函数返回值中包含文本框的大小。
【实例】绘制文字。
1) 新建一个控制台工程,工程名是 test。
2) 打开 main.cpp,输入如下代码:
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
string text = "Funny text inside the box";
// int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX; // 手写风格字体
int fontFace = FONT_HERSHEY_SCRIPT_COMPLEX;
double fontScale = 2; // 字体缩放比
int thickness = 3;
Mat img(600, 800, CV_8UC3, Scalar::all(0));
int baseline = 0;
Size textSize = getTextSize(text, fontFace, fontScale, thickness, &baseline);
baseline += thickness;
// center the text
Point textOrg((img.cols - textSize.width) / 2, (img.rows - textSize.height) / 2);
// draw the box
rectangle(img, textOrg + Point(0, baseline), textOrg + Point(textSize.width, -textSize.height), Scalar(0, 0, 255));
line(img, textOrg + Point(0, thickness), textOrg + Point(textSize.width, thickness), Scalar(0, 0, 255));
putText(img, text, textOrg, fontFace, fontScale, Scalar::all(255), thickness, 8);
imshow("text", img);
waitKey(0);
return 0;
}
在上述代码中,我们通过 getTextSize 函数获取包含字体的文本框的大小,并画线显示在矩形中。最后通过文本绘制函数 putText 画出一段字符串“Funny text inside the box”。3) 保存工程并运行,结果如下图所示:

ICP备案:
公安联网备案: