OPenCV版本:4.4
IDE:VS2017
功能描述
简述:在一个图像里绘制文字。
函数 cv::putText在图像里渲染指定的字符串. 符号不能被渲染,用问号来代替。参见 getTextSize 是一个文字渲染的代码示例.
函数原型
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
)
参数描述
-
参数 img 源图。
-
参数 text 被画的文字字符串。
-
参数 org 文字在画面中左下角的坐标。
-
参数 fontFace 字符类型,参见 HersheyFonts。
-
参数 fontScale 字体比例因子,被字体指定的基础大小所乘。
-
参数 color 文字颜色
-
参数 thickness 划线的厚度
-
参数 lineType 划线类型,参见 LineTypes
-
参数 bottomLeftOrigin 当是true的时候,图像数据源在左下角,否则是在左上角
源码示例
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png");
std::string text = "I am juice";
int font_face = cv::FONT_HERSHEY_COMPLEX;
double font_scale = 2;
int thickness = 4;
int baseline;
//文本框的长宽
cv::Size text_size = cv::getTextSize(text, font_face, font_scale, thickness, &baseline);
//文本框居中绘制
cv::Point origin;
origin.x = image.cols / 2 - text_size.width / 2;
origin.y = image.rows / 2 + text_size.height / 2;
putText(image, text, origin, font_face, font_scale, cv::Scalar(255, 0, 0), thickness, 8, 0);
imshow("文本绘制", image);
cv::waitKey(0);
return 0;
}
运行结果:
附注
字体类型:
enum HersheyFonts {
FONT_HERSHEY_SIMPLEX = 0, //!< 常规大小 没有衬线的字体
FONT_HERSHEY_PLAIN = 1, //!< 小号 没有衬线的字体
FONT_HERSHEY_DUPLEX = 2, //!< 常规大小 复杂的没有衬线的字体
FONT_HERSHEY_COMPLEX = 3, //!< 常规大小 衬线字体
FONT_HERSHEY_TRIPLEX = 4, //!< 常规大小 复杂的衬线字体
FONT_HERSHEY_COMPLEX_SMALL = 5, //!< 小号 衬线字体
FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< 手写风格的字体
FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< 复杂的手写风格的字体
FONT_ITALIC = 16 //!< 斜体字体
};
西方国家字母体系分为两类:衬线字体(serif)和无衬线体(sans serif)。
衬线字体:字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。
无衬线体:是无衬线字体,没有这些额外的装饰,而且笔画的粗细差不多。
中文字体中的宋体就是一种最标准的衬线字体,衬线的特征非常明显。字形结构也和手写的楷书一致。因此宋体一直被做为最适合的正文字体。
线型:
enum LineTypes {
FILLED = -1,
LINE_4 = 4, //!< 4-connected line
LINE_8 = 8, //!< 8-connected line
LINE_AA = 16 //!< antialiased line
};
值越大字体越圆滑