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


    1. 简述

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

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

    2. 使用的API

    (1)cv::getTextSize()

    CV_EXPORTS_W Size getTextSize(const String& text,

                                                              int fontFace,

                                                              double fontScale,

                                                              int thickness,

                                                              CV_OUT int* baseLine);

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

    参数解释:

    text:要绘制的文本字符串

    fontFace:字体的类型参照HersheyFonts

    fontScale:字体放大倍数

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

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

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

    (baseLine指示信息)

    (2)cv::putText

    CV_EXPORTS_W 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 );

    参数解释:

    img: 图像;

    text: 要绘制的文本字符串;

    org: 所绘制文本字符串的原点(默认是左下角,由bottomLeftOrigin控制);

    fontFace: 字体的类型参照HersheyFonts;

    fontScale: 乘以特定于字体的基本大小的字体比例因子(放大倍数);

    color: 字体的颜色;

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

    lineType: 线条的类型参照LineTypes;

    bottomLeftOrigin: 如果为true,则图像数据原点位于左下角。否则,它在左上角;

    fontFace的取值如下:

    FONT_HERSHEY_SIMPLEX = 0    普通大小无衬线字体

    FONT_HERSHEY_PLAIN = 1  小号无衬线字体

    FONT_HERSHEY_DUPLEX = 2 普通大小无衬线字体

    FONT_HERSHEY_COMPLEX = 3    普通大小无衬线字体比 FONT_HERSHEY_DUPLEX 更复杂

    FONT_HERSHEY_TRIPLEX = 4    普通大小无衬字体,比 FONT_HERSHEY_COMPLEX 更复杂

    FONT_HERSHEY_COMPLEX_SMALL = 5  小号版本的 FONT_HERSHEY_COMPLEX

    FONT_HERSHEY_SCRIPT_SIMPLEX = 6 手写字体

    FONT_HERSHEY_SCRIPT_COMPLEX = 7 比 FONT_HERSHEY_SCRIPT_SIMPLEX 更复杂的变体

    FONT_ITALIC =16 斜体(上面的字体都可以和斜体一起使用)

    3. 参考例程

    1. #include <opencv2/opencv.hpp>
    2. #include <iostream>
    3. int main(int argc, char* argv[])
    4. {
    5. /** 读取图像. */
    6. cv::Mat image = cv::imread("demo.jpg"); ///< 替换为你的图片路径
    7. if (image.empty()) {
    8. std::cerr << "Loading image failed!" << std::endl;
    9. return -1;
    10. }
    11. /** 设置OSD文本. */
    12. std::string osdText = "OSD Info";
    13. cv::Point org(50, 50); ///< 文本开始的坐标
    14. int fontFace = cv::FONT_HERSHEY_SIMPLEX;
    15. double fontScale = 1.0;
    16. int thickness = 2;
    17. /** 获取文本尺寸. */
    18. int baseLine;
    19. cv::Size textSize = cv::getTextSize(osdText, fontFace, fontScale, thickness, &baseLine);
    20. /** 确保文本在图像范围内. */
    21. if (org.x + textSize.width > image.cols) {
    22. org.x = image.cols - textSize.width - 10; ///< 留出10个像素的边距
    23. }
    24. if (org.y - baseLine < 0) {
    25. org.y = baseLine + 10; ///< 留出10个像素的边距
    26. }
    27. /** 设置文本颜色. */
    28. cv::Scalar color(0, 0, 255); ///< 红色
    29. /** 绘制OSD文本. */
    30. cv::putText(image, osdText, org, fontFace, fontScale, color, thickness, cv::LINE_AA);
    31. /** 显示和保存图像. */
    32. cv::imwrite("demo_osd.jpg", image); ///< 保存图像
    33. sleep(1);
    34. return 0;
    35. }

  • 相关阅读:
    Android Studio 直接获取Spinner的值
    sql添加索引
    JS简单实现随机颜色验证码功能
    WPF 控件专题 ScrollBar控件详解
    计算机毕业设计选题推荐-车险理赔信息管理系统-Java项目实战
    STM32—触摸键
    【小沐学Python】Python实现Web图表功能(Dash)
    MySQL学习笔记(九)MVCC
    上市公司共同机构所有权数据-附顶刊《管理世界》数据应用示例
    38_Nginx 启动流程
  • 原文地址:https://blog.csdn.net/tecsai/article/details/137872058