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 = falsetrue=‘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 <iostream>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

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");
}

在这里插入图片描述

Sans Serif和Serif

  在西方国家罗马字母阵营中,字体分为两大种类:Sans Serif和Serif,打字机体虽然也属于Sans Serif,但由于是等宽字体,所以另外独立出Monospace这一种类,例如在Web中,表示代码时常常要使用等宽字体。
  Serif的意思是,在字的笔划开始及结束的地方有额外的装饰,而且笔划的粗细会因直横的不同而有不同。相反的,Sans Serif则没有这些额外的装饰,笔划粗细大致差不多。如下图:
在这里插入图片描述
  可以看出,我们平时所用的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),所以大部分的人都使用歌德体(相当于西洋文字的无衬线体)。
在这里插入图片描述

适用用途:

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

引用

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑山老妖的笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值