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::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");
}
在西方国家罗马字母阵营中,字体分为两大种类: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则较醒目,但在行文阅读的情况下,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字体的区别