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. 参考例程

#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;  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 删除对象中的属性,可以使用js里的delete,但需注意ts定义对象类型!

如上如&#xff0c;当使用delete 删除stateData中的属性时&#xff0c; 报错&#xff0c;意思为 TypeScript 错误“‘delete’ 运算符的操作数必须是可选的 什么原因呢&#xff1f;是因为我偷懒 缺少了ts定义类型 方法一&#xff1a; &#xff08;不推荐&#xff09; delete …

MultiHeadAttention在Tensorflow中的实现原理

前言 通过这篇文章&#xff0c;你可以学习到Tensorflow实现MultiHeadAttention的底层原理。 一、MultiHeadAttention的本质内涵 1.Self_Atention机制 MultiHeadAttention是Self_Atention的多头堆嵌&#xff0c;有必要对Self_Atention机制进行一次深入浅出的理解&#xff0c;这…

Linux Makefile用法

1、什么是makefile&#xff1f; Makefile&#xff1a;将不同模块放在不同的目录中&#xff0c;定义一系列的规则进行 “自动化编译”2、Makefile写法 vim makefile 填写样例&#xff1a; app:sub.c add.c mult.c div.c main.cgcc sub.c add.c mult.c div.c main.c -o app3、工作…

刷代码随想录有感(39):每层最大值

题干&#xff1a; 代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), …

OpenCV基本图像处理操作(十一)——图像特征Sift算法

图像尺度空间 在一定的范围内&#xff0c;无论物体是大还是小&#xff0c;人眼都可以分辨出来&#xff0c;然而计算机要有相同的能力却很难&#xff0c;所以要让机器能够对物体在不同尺度下有一个统一的认知&#xff0c;就需要考虑图像在不同的尺度下都存在的特点。 尺度空间的…

《6G数据面架构研究》

目录 一、数据服务的定义二、6G数据服务驱动力及面临的挑战6G数据服务的业务驱动6G数据服务的技术驱动6G数据服务的网络内在驱动6G数据面面临的挑战 三、6G数据服务典型场景自动化网络运维用户体验提升通信感知数据服务 四、6G数据面架构研究数据面架构视图功能定义说明&#x…

kafka部分partition的leader=-1修复方案整理

kafka部分partition的leader-1修复方案整理 1. 背景说明2. 修复测试2.1 创建正常的topic并验证生产和消费2.2 停止kafka模拟leader-12.3 修复parition2.4 修复完成验证生产消费是否恢复 3. 疑问和思考3.1 kafka在进行数据消费时&#xff0c;如果有partition的leader-1&#xff…

从迷宫问题理解dfs

文章目录 迷宫问题打印路径1思路定义一个结构体要保存所走的路径&#xff0c;就需要使用到栈遍历所有的可能性核心代码 部分函数递归图源代码 迷宫问题返回最短路径这里的思想同上面类似。源代码 迷宫问题打印路径1 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&…

十一、Yocto集成tcpdump等网络工具

文章目录 Yocto集成tcpdump等网络工具networking layer集成 Yocto集成tcpdump等网络工具 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十一篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi 4B) 三、Yocto创建自定义的lay…

ctf.show_web14

在switch中&#xff0c;case 里如果没有 break&#xff0c;则会继续向下执行 case。 过滤了information_schema.tables、information_schema.column、空格 information_schema.tables 或 .columns 用反引号 information_schema.tables 同时查3个字段 ?query-1/**/union/**/…

ssh免秘钥登录与时钟同步

ssh免秘钥登录及数据拷贝 ssh免秘钥登录及数据拷贝环境生成秘钥拷贝公钥到到远程服务器通过ssh-copy-id命令拷贝公钥到远程服务器通过手动拷贝公钥到远程服务器 非root用户远程拷贝公钥 设置编码方式临时设置编码永久设置方法一永久设置方法二 设置时钟同步使用 ntpdate 命令使…

血糖长期不降,乏力、视力模糊?可能治疗方向有误。

糖尿病能不能治愈&#xff0c;中医能不能治&#xff0c;这是很多人讨论的话题&#xff0c;现在全世界任何一家西医医院都会告诉你&#xff0c;糖尿病没办法治&#xff0c;给你的建议也是终身服药&#xff0c;或者打胰岛素治疗&#xff0c;但是我告诉你&#xff0c;其实这都是治…

Jmeter04:关联

1 Jmeter组件&#xff1a;关联 概括&#xff1a;2个请求之间不是独立的&#xff0c;一个请求响应的结果是作为另一个请求提交的数据&#xff0c;存在数据交互 1.1 是什么&#xff1f; 就是一个请求的结果是另一个请求提交的数据&#xff0c;二者不再是独立 1.2 为什么&#x…

深入理解Java IO流:字符流

深入理解Java IO流&#xff1a;字符流 引言 在Java中&#xff0c;IO&#xff08;输入/输出&#xff09;操作是程序与外部世界交互的重要方式。 其中&#xff0c;File类是进行文件操作的基础&#xff0c;而字节流和字符流则是数据传输的两种主要方式。 本文将深入探讨这些概念及…

【Redis 神秘大陆】004 高可用集群

四、Redis 高可用和集群 当你发现这些内容对你有帮助时&#xff0c;为了支持我的工作&#xff0c;不妨给一个免费的⭐Star&#xff0c;这将是对我最大的鼓励&#xff01;感谢你的陪伴与支持&#xff01;一起在技术的路上共同成长吧&#xff01;点击链接&#xff1a;GitHub | G…

算法总结篇 —— dfs(搜索、递归、回溯)

有些事情本来很遥远&#xff0c;你争取&#xff0c;它就会离你越来越近 概念 名词解释如何理解递归 dfs 回溯类问题蓝桥杯——飞机降落 dfs 迷宫搜索类问题蓝桥杯——岛屿个数 概念 名词解释 递归是指在一个函数的定义中调用自身的过程&#xff0c;有些复杂问题可以划分为多…

c++的学习之路:26、AVL树

摘要 本章主要是说一下AVL树的实现&#xff0c;这里说的是插入的底层原理 目录 摘要 一、原理 二、四种旋转 1、左单旋 2、右单旋 3、左右双旋 4、右左双旋 三、代码实现 1、节点创建 2、插入 3、旋转 4、判断是否平衡 5、测试 四、代码 一、原理 前面说了搜索…

为啥转化为可编辑面片后有这么多点和线

可以删一下 按住alt按移除可以删掉 选择你要删的那些线 按住alt点移除

eBay、亚马逊自养号测评如何避免风控账号关联选择合适网络IP环境

在自养号下单中选择适合的网络环境至关重要。经过多次实践与测试&#xff0c;积累了大量的经验&#xff0c;希望能够与大家分享&#xff0c;帮助大家避开陷阱&#xff0c;顺利前行。 市面上的网络环境种类繁多&#xff0c;从纯IP类的Luminati、Rola&#xff0c;到纯环境类的VM…

编写Spark独立应用程序

执行本文之前&#xff0c;先搭建好spark的开发环境&#xff0c;我目前只搭建了standalone模式&#xff0c;参考链接 &#xff1a; Spark Standalone模式部署-CSDN博客 1. 安装sbt 1&#xff09;下载sbt 网址&#xff1a;https://www.scala-sbt.org/download.html &#xff0c…