本文主要是关于绘制文本以及获取文字字体大小的说明。
cv::putText()是OpenCV中的一个主要文字绘制的方法,可以简单地在图像上绘制一些文字。函数声明:
void cv::putText(
cv::Mat& img, // image to be drawn on
const string& text, // write this (often from cv::format)
cv::Point origin, // upper-left corner of text box
int fontFace, // font,e.r., cv::FONT_HERSHEY_PLAIN
double fontScale, // size (a multiplier,not points!
cv::Scalar color, // color,BGR form
int thickness = 1, // thickness of line
int lineType = 8, // connectedness, 4 or 8
bool bottomLeftOrigin = false // true = origin at lower left
);
函数说明:由text指定的文字将在以左上角为原点的文字框中以color指定的颜色绘制出来,除非bottomLeftOrigin标志被设置为真,这种情况下文字框将以左下角为原点。使用的字体由fontFace参数据决定,可取的值如下表:
标识符 | 描述 |
cv::FONT_HERSHEY_SIMPLEX | 普通大小无衬线字体 |
cv::FONT_HERSHEY_PLAIN | 小号无衬线字体 |
cv::FONT_HERSHEY_DUPLEX | 普通大小无衬线字体,比cv::FONT_HERSHEY_SIMPLE更复杂 |
cv::FONT_HERSHEY_COMPLEX | 普通大小无衬线字体,比cv::FONT_HERSHEY_DUPLEX更复杂 |
cv::FONT_HERSHEY_TRIPLEX | 普通大小无衬线字体,比cv::FONT_HERSHEY_COMPLEX更复杂 |
cv::FONT_HERSHEY_COMPLEX_SMALL | 小号版本的cv::FONT_HERSHEY_COMPLEX |
cv::FONT_HERSHEY_SCRIPT_SIMPLE | 手写字体 |
cv::FONT_HERSHEY_SCRIPT_COMPLEX | 比cv::FONT_HERSHEY_SCRIPT_SIMPLEX更复杂的变体 |
上表中的字体都可以和cv::FONT_HERSHEY_ITALIC组合使用(通过或操作)来得到斜体。每种字体都有一个自然大小,当fontScale不是1.0时,在文字绘制之前字体大小将由这个数缩放。
cv::getTextSize()回答了如果把文字绘制出来将有多大的问题,不用实际将文字绘制到图上。cv::getTextSize的新参数是baseLine,是一个输出参数,baseLine是和文字最低点相关的文字基线的y坐标值。函数声明如下:
cv::Size cv::getTextSize(
const string& text,
cv::Point origin,
int fontFace,
double fontScale,
int thickness,
int* baseLine
);
上面两个函数使用示例:
cv::Mat image(400, 1100, CV_8UC3, cv::Scalar(128,128, 128));
int ny,nHeight;
ny = 35;
std::string text = "cv::FONT_HERSHEY_SIMPLEX";
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_SIMPLEX,1.0, CV_RGB(255, 255, 0),1);
cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 1.0, 1, &nHeight);
text = "cv::FONT_HERSHEY_PLAIN";
ny += nHeight+10;
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_PLAIN, 1.0, CV_RGB(255, 255, 0), 1);
cv::getTextSize(text, cv::FONT_HERSHEY_PLAIN, 1.0, 1, &nHeight);
text = "cv::FONT_HERSHEY_DUPLEX";
ny += nHeight+nHeight*4;
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_DUPLEX, 1.0, CV_RGB(255, 255, 0), 1);
cv::getTextSize(text, cv::FONT_HERSHEY_DUPLEX, 1.0, 1, &nHeight);
text = "cv::FONT_HERSHEY_COMPLEX";
ny += nHeight + nHeight * 4;
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_COMPLEX, 1.0, CV_RGB(255, 255, 0), 1);
cv::getTextSize(text, cv::FONT_HERSHEY_COMPLEX, 1.0, 1, &nHeight);
text = "cv::FONT_HERSHEY_TRIPLEX";
ny += nHeight + nHeight * 4;
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_TRIPLEX, 1.0, CV_RGB(255, 255, 0), 1);
cv::getTextSize(text, cv::FONT_HERSHEY_TRIPLEX, 1.0, 1, &nHeight);
text = "cv::FONT_HERSHEY_COMPLEX_SMALL small version cv::FONT_HERSHEY_COMPLEX";
ny += nHeight + nHeight * 4;
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_COMPLEX_SMALL, 1.0, CV_RGB(255, 255, 0), 1);
cv::getTextSize(text, cv::FONT_HERSHEY_COMPLEX_SMALL, 1.0, 1, &nHeight);
text = "cv::FONT_HERSHEY_SCRIPT_SIMPLEX";
ny += nHeight + nHeight * 4;
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, CV_RGB(255, 255, 0), 1);
cv::getTextSize(text, cv::FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, 1, &nHeight);
text = "cv::FONT_HERSHEY_SCRIPT_COMPLEX";
ny += nHeight + nHeight * 4;
cv::putText(image, text, cv::Point(10, ny), cv::FONT_HERSHEY_SCRIPT_COMPLEX, 1.0, CV_RGB(255, 255, 0), 1);
cv::getTextSize(text, cv::FONT_HERSHEY_SCRIPT_COMPLEX, 1.0, 1, &nHeight);
cv::namedWindow("image", cv::WINDOW_AUTOSIZE);
cv::imshow("image", image);
cv::waitKey(0);
cv::destroyAllWindows();
显示结果: