1. 简述
我们使用OpenCV时,有时会在图像的某个位置绘制OSD信息,如绘制一些字符串作为指示信息。
本文将简要介绍在图像(cv::Mat)上绘制固定的字符串信息。
2. 使用的API
(1)cv::getTextSize()
一般情况下,我们可以直接指定绘制文本的原点信息(默认为左下角坐标),但为了防止出现字符串溢出的问题,还是建议首先通过该API获得在图像上的大小信息。
参数解释:
text:要绘制的文本字符串
fontFace:字体的类型参照HersheyFonts
fontScale:字体放大倍数
thicknes:用于绘制文本的线条的粗细
baseLine:相对于最底部文本的基线y坐标指向
baseLine是文本最低点对应的Y坐标,如下,蓝色线条的Y坐标即是baseLine。
(baseLine指示信息)
(2)cv::putText
参数解释:
fontFace的取值如下:
3. 参考例程
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char* argv[])
{
/** 读取图像. */
cv::Mat image = cv::imread("demo.jpg"); ///< 替换为你的图片路径
if (image.empty()) {
std::cerr << "Loading image failed!" << std::endl;
return -1;
}
/** 设置OSD文本. */
std::string osdText = "OSD Info";
cv::Point org(50, 50); ///< 文本开始的坐标
int fontFace = cv::FONT_HERSHEY_SIMPLEX;
double fontScale = 1.0;
int thickness = 2;
/** 获取文本尺寸. */
int baseLine;
cv::Size textSize = cv::getTextSize(osdText, fontFace, fontScale, thickness, &baseLine);
/** 确保文本在图像范围内. */
if (org.x + textSize.width > image.cols) {
org.x = image.cols - textSize.width - 10; ///< 留出10个像素的边距
}
if (org.y - baseLine < 0) {
org.y = baseLine + 10; ///< 留出10个像素的边距
}
/** 设置文本颜色. */
cv::Scalar color(0, 0, 255); ///< 红色
/** 绘制OSD文本. */
cv::putText(image, osdText, org, fontFace, fontScale, color, thickness, cv::LINE_AA);
/** 显示和保存图像. */
cv::imwrite("demo_osd.jpg", image); ///< 保存图像
sleep(1);
return 0;
}