Opencv练习-绘制文字-putText

cv::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 );

  函数功能:在图像指定位置绘制文字;
  参数说明

参数名成 含义
cv::Mat& img 待绘制的图像,作为画布
const string& text 待绘制的文字
cv::Point org 文本框的左下角
int fontFace 字体 (如cv::FONT_HERSHEY_PLAIN)
double fontScale 尺寸因子,值越大文字越大
Scalar color 线条的颜色(RGB)
int thickness = 1 线条宽度,默认为1
int lineType = LINE_8 线型,4邻域或8邻域,默认8邻域
bool bottomLeftOrigin = false true=‘origin at lower left’

  注意:putText不支持中文;
  putText支持的字体格式为:

功能
FONT_HERSHEY_SIMPLEX 正常尺寸的sans-serif字体
FONT_HERSHEY_PLAIN 小字体的sans-serif字体
FONT_HERSHEY_DUPLEX 正常尺寸的sans-serif字体,稍微不同
FONT_HERSHEY_COMPLEX 正常尺寸的serif字体
FONT_HERSHEY_TRIPLEX 正常尺寸的serif字体,稍微不同
FONT_HERSHEY_COMPLEX_SMALL 小字体的serif字体
FONT_HERSHEY_SCRIPT_SIMPLEX 手写字体
FONT_HERSHEY_SCRIPT_COMPLEX 手写字体 ,稍微不同
FONT_ITALIC

cv::getTextSize()

	cv::Size cv::getTextSize(const string& text,cv::Point origin,int fontFace,
		double fontScale,int thickness,int* baseLine);

  函数功能:获取text的像素长度和宽度;Size中有width和height;其他参数应与putText保持一致,才能计算出正确数值;

测试代码

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

void DrawText(Mat& img, string str, int x, int& y, int type, Scalar color)
{
	int baseline = 0;
	for (int i = 0; i < 5; i++)
	{
		cv::Size str_size = cv::getTextSize("Liu And Wang", type, 1.0, i, &baseline);
		cv::putText(img, str.c_str(), Point(0, y + str_size.height), type, 1.0, color, i);
		y += str_size.height;
	}
}
int main()
{
	Mat img = cv::Mat::zeros(1024, 1024, CV_8UC3);
	int y = 0;
	// FONT_HERSHEY_SIMPLEX
	DrawText(img, "FONT_HERSHEY_SIMPLEX", 0, y, FONT_HERSHEY_SIMPLEX, Scalar(255, 255, 255));
	DrawText(img, "FONT_HERSHEY_PLAIN", 0, y, FONT_HERSHEY_PLAIN, Scalar(255, 0, 0));
	DrawText(img, "FONT_HERSHEY_DUPLEX", 0, y, FONT_HERSHEY_DUPLEX, Scalar(0, 255, 0));
	DrawText(img, "FONT_HERSHEY_COMPLEX", 0, y, FONT_HERSHEY_COMPLEX, Scalar(0, 0, 255));
	DrawText(img, "FONT_HERSHEY_TRIPLEX", 0, y, FONT_HERSHEY_TRIPLEX, Scalar(128, 128, 128));
	DrawText(img, "FONT_HERSHEY_COMPLEX_SMALL", 0, y, FONT_HERSHEY_COMPLEX_SMALL, Scalar(128, 128, 0));
	DrawText(img, "FONT_HERSHEY_SCRIPT_SIMPLEX", 0, y, FONT_HERSHEY_SCRIPT_SIMPLEX, Scalar(0, 128, 128));
	DrawText(img, "FONT_HERSHEY_SCRIPT_COMPLEX", 0, y, FONT_HERSHEY_SCRIPT_COMPLEX, Scalar(128, 0, 128));
	DrawText(img, "FONT_ITALIC", 0, y, FONT_ITALIC, Scalar(255, 255, 255));

	imshow("Image", img);
	waitKey(0);
	
	system("pause");
}

Opencv练习-绘制文字-putText_第1张图片

Sans Serif和Serif

  在西方国家罗马字母阵营中,字体分为两大种类:Sans Serif和Serif,打字机体虽然也属于Sans Serif,但由于是等宽字体,所以另外独立出Monospace这一种类,例如在Web中,表示代码时常常要使用等宽字体。
  Serif的意思是,在字的笔划开始及结束的地方有额外的装饰,而且笔划的粗细会因直横的不同而有不同。相反的,Sans Serif则没有这些额外的装饰,笔划粗细大致差不多。如下图:
Opencv练习-绘制文字-putText_第2张图片
  可以看出,我们平时所用的Georgia、Times New Roman等就属于Serif字体,而Arial、Tahoma、Verdana等则属于Sans Serif字体。对中文而言,同样存在这两大种类,很明显,宋体、细明体(繁体中常用)等就属于Serif,而黑体、幼圆等则属于Sans Serif。

Serif和Sans Serif的一般比较:

  ①Serif的字体容易辨认,因此易读性较高。反之Sans Serif则较醒目,但在行文阅读的情况下,Sans Serif容易造成字母辨认的困扰,常会有来回重读及上下行错乱的情形。
  ②Serif强调了字母笔划的开始及结束,因此较易前后连续性的辨识。
  ③Serif强调一个word,而非单一的字母,反之Sans Serif则强调个别字母。
  ④在小字体的场合,通常Sans Serif比Serif更清晰。
  因为黑体字属于“无衬线体”(Sans-serif),而宋体字属于“有衬线体”(Serif),后者对于人眼的辨识来说会更轻松一些,所以阅读的时候会比较舒服。日本文字偏欧美的无衬线体(Sans-serif),所以大部分的人都使用歌德体(相当于西洋文字的无衬线体)。
Opencv练习-绘制文字-putText_第3张图片

适用用途:

  通常文章的内文、正文使用的是易读性较佳的Serif字体,这可增加易读性,而且长时间阅读下因为会以word为单位来阅读,较不容易疲倦。而标题、表格内用字则採用较醒目的Sans Serif字体,它需要显着、醒目,但不必长时间盯着这些字来阅读。
  像宣传品、海报类,为求醒目,它的短篇的段落也会採用Sans Serif字体。但在书籍、报刊杂志,正文有相当篇幅的情形下,则应採用Serif字体来减轻读者阅读上的负担。在Web设计及浏览器设置中也应遵循此原则为是。

引用

1.Serif和Sans-serif字体的区别

你可能感兴趣的:(OpenCV)