使用 OpenCV 在图像中添加文字
在图像处理任务中,我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数,可以很方便地在图像上绘制文本,支持多种字体、颜色、大小和位置等参数。
本文将详细介绍如何使用 OpenCV 在图像中添加文字,介绍 cv2.putText() 的语法、参数及使用示例。
1. cv2.putText() 函数简介
cv2.putText() 是 OpenCV 中的一个函数,用于在图像上绘制文本。通过该函数,我们可以指定文本的内容、位置、字体、大小、颜色等属性。
函数语法:
cv2.putText(image, text, org, fontFace, fontScale, color, thickness, lineType=cv2.LINE_AA)
参数说明:
- image:输入图像,文本将被添加到该图像上。
- text:要绘制的文本字符串。
- org:文本的左下角坐标
(x, y),即文本起始点的位置。 - fontFace:字体类型。OpenCV 提供了几种字体类型,常用的有
cv2.FONT_HERSHEY_SIMPLEX。 - fontScale:字体大小,通常为浮动值,值越大字体越大。
- color:文本颜色,指定为 BGR 格式的颜色元组(例如
(255, 0, 0)表示蓝色)。 - thickness:文本的粗细程度。值越大,文本的边缘就越粗。
- lineType:线型,通常设置为
cv2.LINE_AA,表示抗锯齿线条,效果更加平滑。
2. 基本示例:在图像中写文字
我们将通过一个简单的示例,展示如何在图像上添加文本。
示例代码:
import cv2
import numpy as np# 创建一个白色背景的图像
image = np.ones((400, 600, 3), dtype=np.uint8) * 255# 要写入的文本
text = "Hello, OpenCV!"# 设置文本的位置(左下角)
org = (50, 200)# 设置字体、大小、颜色和粗细
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1.5
color = (0, 0, 255) # 红色
thickness = 2# 在图像上添加文本
cv2.putText(image, text, org, font, font_scale, color, thickness)# 显示图像
cv2.imshow("Text on Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解析:
- 创建图像:我们创建了一幅 400x600 的白色背景图像(
np.ones((400, 600, 3), dtype=np.uint8) * 255)。 - 定义文本:定义要写入的文本为
"Hello, OpenCV!"。 - 设置文本属性:
org:指定文本的起始位置(50, 200),即文本的左下角位置。font:设置字体为cv2.FONT_HERSHEY_SIMPLEX,这是一种简单的字体。font_scale:设置字体大小为1.5。color:设置文本颜色为红色((0, 0, 255),BGR 格式)。thickness:设置文本的粗细为2。
- 绘制文本:调用
cv2.putText()在图像上绘制文本。 - 显示图像:使用
cv2.imshow()显示图像,并在按下任意键后关闭窗口。
3. 更改字体类型和大小
OpenCV 支持几种常用的字体类型,常见的包括:
- cv2.FONT_HERSHEY_SIMPLEX:无衬线字体(最常用的字体)。
- cv2.FONT_HERSHEY_PLAIN:简单无衬线字体。
- cv2.FONT_HERSHEY_DUPLEX:较粗的无衬线字体。
- cv2.FONT_HERSHEY_COMPLEX:复杂的无衬线字体。
- cv2.FONT_HERSHEY_TRIPLEX:较粗的复杂无衬线字体。
- cv2.FONT_HERSHEY_COMPLEX_SMALL:复杂的小无衬线字体。
- cv2.FONT_HERSHEY_SCRIPT_SIMPLEX:简单的手写字体。
- cv2.FONT_HERSHEY_SCRIPT_COMPLEX:复杂的手写字体。
示例:使用不同的字体
import cv2
import numpy as np# 创建一个白色背景的图像
image = np.ones((400, 600, 3), dtype=np.uint8) * 255# 要写入的文本
text = "Font Example!"# 设置文本的位置(左下角)
org = (50, 200)# 设置字体、大小、颜色和粗细
font = cv2.FONT_HERSHEY_DUPLEX
font_scale = 2
color = (0, 255, 0) # 绿色
thickness = 3# 在图像上添加文本
cv2.putText(image, text, org, font, font_scale, color, thickness)# 显示图像
cv2.imshow("Text with Different Font", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 文本对齐
在 OpenCV 中,文本的位置通常是从文本的左下角开始指定的(即 (x, y) 坐标)。如果你需要更精确的文本对齐(例如居中、右对齐),你需要根据文本的大小进行计算。可以使用 cv2.getTextSize() 函数来获取文本的大小,然后进行适当的调整。
示例:文本居中对齐
import cv2
import numpy as np# 创建一个白色背景的图像
image = np.ones((400, 600, 3), dtype=np.uint8) * 255# 要写入的文本
text = "Centered Text"# 获取文本大小
(font_width, font_height), baseline = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2)# 计算文本的起始位置,使其居中
org = ((image.shape[1] - font_width) // 2, (image.shape[0] + font_height) // 2)# 在图像上添加文本
cv2.putText(image, text, org, cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# 显示图像
cv2.imshow("Centered Text", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解析:
- 获取文本大小:
cv2.getTextSize()函数返回一个元组(font_width, font_height),表示文本的宽度和高度,以及baseline(基线的偏移量)。 - 计算居中位置:通过
(image.shape[1] - font_width) // 2计算文本水平居中的位置,通过(image.shape[0] + font_height) // 2计算文本垂直居中的位置。 - 绘制文本:将计算好的坐标传入
cv2.putText()。
5. 总结
在 OpenCV 中,使用 cv2.putText() 函数,我们可以轻松地在图像上添加各种文本。可以通过调整字体类型、大小、颜色、粗细等属性,来满足不同的需求。同时,通过计算文本的尺寸,还可以实现文本的精确对齐(如居中、右对齐等)。这些操作在图像标注、生成图表、图像处理和计算机视觉任务中都非常有用。
相关文章:
使用 OpenCV 在图像中添加文字
在图像处理任务中,我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数,可以很方便地在图像上绘制文本,支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字,介绍 cv2.putTe…...
实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4
大家好,我是Q,邮箱:1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求,讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考: 实现某海外大型车企(T)Cabin Wi-Fi 需求…...
Linux系统:内核态与用户态的深层思考
背景: 我们学习Linux的系统调用经常会遇到一个概念:“内核态和用户态的切换”,一般人只会告诉你说这个切换代价很大,具体是什么情况?为什么需要切换?一定需要切换吗?怎么就会触发切换࿱…...
# 光速上手 - JPA 原生 sql DTO 投影
前言 使用 JPA 时,我们一般通过 Entity 进行实体类映射,从数据库中查询出对象。然而,在实际开发中,有时需要自定义查询结果并将其直接映射到 DTO,而不是实体类。这种需求可以通过 JPA 原生 SQL 查询和 DTO 投影 来实现…...
ASP.NET Web应用程序出现Maximum request length exceeded报错
一、问题描述 在ASP.NET的web应用中,导出数据时出现500 - Internal server error.Maximum request length exceeded。 二、原因分析 这个错误通常出现在Web应用程序中,表示客户端发送的HTTP请求的长度超过了服务器配置的最大请求长度限制。这可能是因为…...
HTML——16.相对路径
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><a href"../../fj1/fj2/c.html" target"_blank">链接到c</a><!--相对路径:-->…...
windows 默认的消息ID有那些---我与大模型对话
前言: 与大模型交流,提问要尽量简短,突出关键词。否则它的回答就可能事是而非。用它总结和查资料还行,用它解决问题路还很远。它非常注重标准格式并机械的执行标准格式,并且事无巨细,不能灵活简要的回答问…...
CSV vs 数据库:爬虫数据存储的最佳选择是什么
介绍 在爬虫技术中,数据存储是一个不可缺少的环节。然而,选择合适的存储方式对数据分析和结果应用都致关重要。CSV和数据库是常用的两种存储方式,但它们各有优缺。这篇文章将分析两者在爬虫数据存储方面的选择值。 微博热搜是当前网络热点话…...
编译原理学习笔记——CH7-Runtime Environments运行时环境
本章重点: 为什么函数调用可以采用栈式存储? 函数调用和返回过程中需要记录哪些信息?如何记录? 主要知识点: 环境、状态、activation (激活) of procedures 、elaboration (确立…...
机器学习DAY7: 特征工程和特征选择(数据预处理)(完)
本文通过特征提取、特征转换、特征选择三个过程介绍数据预处理方法,特征提取将原始数据转换为适合建模的特征,特征转换将数据进行变换以提高算法的准确性,特征选择用来删除无用的特征。 知识点 特征提取特征转换特征选择 本次实验的一些示…...
vue3动态加载组件
如何在Vue3中动态加载组件 需求根据下拉框的值,加载不同的组件 新建文件aaa.vue,bbb.vue <template><div class"container">我是bbbb组件</div> </template><script lang"ts" setup name"taskPus…...
12.29 redis缓存一致性
更新操作 如果先更新数据库再更新缓存 先更新缓存再更新数据库 更新缓存为1 更新缓存尾2 更新数据库为2 更新数据库为1 那么最后缓存为2 数据库为1 数据不一致 先更新数据库,再更新缓存 数据库为1 数据库为2 缓存为2 缓存为1 还是不一致 于是这种情况我们改为将缓…...
SqlSugar配置连接达梦数据库集群
安装达梦数据库时,会自动在当前操作系统中创建dm_svc.conf文件,可以在其中配置集群信息,不同操作系统下的文件位置如下图所示: dm_svc.conf文件内的数据分为全局配置区域、服务配置区域,以参考文献1中的示例说明&…...
评分模型在路网通勤习惯分析中的应用——提出问题(1)
1、问题的由来、目标和意义 最近一段时间和公司其它业务部门讨论时,发现一个有趣的交通路网问题,车辆从S点行驶到V点共用时40分钟,这段时间内路网中的卡口摄像头识别到了车辆通过的信息。如下图所示: 设计师需要通过这些有限的路…...
使用 OpenCV 绘制线条和矩形
OpenCV 是一个功能强大的计算机视觉库,它不仅提供了丰富的图像处理功能,还支持图像的绘制。绘制简单的几何图形(如线条和矩形)是 OpenCV 中常见的操作。在本篇文章中,我们将介绍如何使用 OpenCV 在图像上绘制线条和矩形…...
npm 切换镜像源
设置镜像源 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ npm 官方原始镜像网址是:https://registry.npmjs.org/ 淘宝 NPM 镜像:https://registry.npm.taobao.org 阿里云 NPM 镜像:https://npm.aliyun.com 腾…...
CSS(四)display和float
display display 属性用于控制元素的显示类型,用的 display 值包括: block:块级元素 使元素成为块级元素,占据一整行,前后有换行宽度默认为父容器的 100%,可以设置宽高,支持 margin、padding、…...
MMaudio AI:如何通过 AI 实现精准的视频到音频合成
1. 引言:视频音效制作的新纪元 无论是短视频创作者还是电影后期制作团队,音效始终是提升作品质量的关键。然而,手动调整音效不仅耗时,还容易出错。试想,如果一项 AI 技术能够根据视频内容自动生成与画面完美同步的音效…...
SQL进阶技巧:如何分析双重职务问题?
目录 0 背景描述 1 数据准备 2 问题分析 方法2:利用substr函数,充分利用数据特点【优秀解法】 3 小结...
OpenCV相机标定与3D重建(37)计算两幅图像之间单应性矩阵(Homography Matrix)的函数findHomography()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到两个平面之间的透视变换。 cv::findHomography 是 OpenCV 库中用于计算两幅图像之间单应性矩阵(Homography Matrix)的…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...
python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...
【多线程初阶】单例模式 指令重排序问题
文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...
uni-app学习笔记二十三--交互反馈showToast用法
showToast部分文档位于uniapp官网-->API-->界面:uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容,长度与 icon 取值有关。iconString否图…...


