1. 简述

        我们使用OpenCV时,有时会在图像的某个位置绘制OSD信息,如绘制一些字符串作为指示信息。

本文将简要介绍在图像(cv::Mat)上绘制固定的字符串信息。

2. 使用的API

(1)cv::getTextSize()

        一般情况下,我们可以直接指定绘制文本的原点信息(默认为左下角坐标),但为了防止出现字符串溢出的问题,还是建议首先通过该API获得在图像上的大小信息。

参数解释:

text:要绘制的文本字符串

fontFace:字体的类型参照HersheyFonts

fontScale:字体放大倍数

thicknes:用于绘制文本的线条的粗细

baseLine:相对于最底部文本的基线y坐标指向

baseLine是文本最低点对应的Y坐标,如下,蓝色线条的Y坐标即是baseLine。

OpenCV杂记(1):绘制OSD(cv::getTextSize, cv::putText)-LMLPHP

(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;  

}
04-17 16:54