使用 OpenCV 在图像中添加文字

news2025/2/12 19:56:30

在图像处理任务中,我们经常需要将文本添加到图像中。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()

代码解析:

  1. 创建图像:我们创建了一幅 400x600 的白色背景图像(np.ones((400, 600, 3), dtype=np.uint8) * 255)。
  2. 定义文本:定义要写入的文本为 "Hello, OpenCV!"
  3. 设置文本属性
    • org:指定文本的起始位置 (50, 200),即文本的左下角位置。
    • font:设置字体为 cv2.FONT_HERSHEY_SIMPLEX,这是一种简单的字体。
    • font_scale:设置字体大小为 1.5
    • color:设置文本颜色为红色((0, 0, 255),BGR 格式)。
    • thickness:设置文本的粗细为 2
  4. 绘制文本:调用 cv2.putText() 在图像上绘制文本。
  5. 显示图像:使用 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()

代码解析:

  1. 获取文本大小cv2.getTextSize() 函数返回一个元组 (font_width, font_height),表示文本的宽度和高度,以及 baseline(基线的偏移量)。
  2. 计算居中位置:通过 (image.shape[1] - font_width) // 2 计算文本水平居中的位置,通过 (image.shape[0] + font_height) // 2 计算文本垂直居中的位置。
  3. 绘制文本:将计算好的坐标传入 cv2.putText()

5. 总结

在 OpenCV 中,使用 cv2.putText() 函数,我们可以轻松地在图像上添加各种文本。可以通过调整字体类型、大小、颜色、粗细等属性,来满足不同的需求。同时,通过计算文本的尺寸,还可以实现文本的精确对齐(如居中、右对齐等)。这些操作在图像标注、生成图表、图像处理和计算机视觉任务中都非常有用。

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

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

相关文章

解线性方程组

直接三角分解(LU分解,Doolittle分解) ATM分解(追赶法,Crout分解,克劳特分解) 平方根法(Cholesky分解,乔列斯基分解) 矩阵的范数

17.2、应急事件场景与处理流程

目录 常见网络安全应急事件场景网络安全应急处理流程应急演练类型 常见网络安全应急事件场景 应急事件的处理场景,分成四类场景,恶意程序事件,网络攻击事件,还有网站相关的一些安全事件,最后是拒绝服务事件 恶意程序…

并发编程 - 死锁的产生、排查与解决方案

在多线程编程中,死锁是一种非常常见的问题,稍不留神可能就会产生死锁,今天就和大家分享死锁产生的原因,如何排查,以及解决办法。 线程死锁通常是因为两个或两个以上线程在资源争夺中,形成循环等待&#xf…

关于埃斯顿机器人文件导出或者系统日志导出

关于埃斯顿机器人文件导出或者日志导出,登录模式,选择高级设置,控制器备份恢复 选择U盘导入地址,点击导出,等待时间30秒就可以查看文件格式和系统日志

5G CPE接口扩展之轻量型多口千兆路由器小板选型

多口千兆路由器小板选型 方案一: 集成式5口千兆WIFI路由器小板方案二:交换板 + USBwifiUSB WIFI选型一USBwifi选型二:四口千兆选型一四口千兆选型二:四口千兆选型三:部分5G CPE主板不支持Wifi,并且网口数量较少,可采用堆叠方式进行网口和wifi功能 扩展,本文推荐一些路由…

PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering

“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型,将图像处理任务统一为视觉提示问答范式,在多个图像处理任务上展现出良好性能,为通用图像处理提供了新的思路和方法。 confe…

【MySQL】索引 面试题

文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构,通过维护特定查找算法的数据结构(如B树),以某种方式引用数据&#xf…

Doxygen 使用指南

Doxygen 是一个文档生成工具,可以从源代码中的注释生成高质量的文档,支持多种编程语言(如 C/C、Python、Java 等)。以下是 Doxygen 的基本使用方法。 1. 安装 Doxygen 1.1 下载 Doxygen 访问 Doxygen 官网。根据操作系统选择合适…

Jensen-Shannon Divergence:定义、性质与应用

一、定义 Jensen-Shannon Divergence(JS散度)是一种衡量两个概率分布之间差异的方法,它是Kullback-Leibler Divergence(KL散度)的一种对称形式。JS散度在信息论、机器学习和统计学等领域中具有广泛的应用。 给定两个概…

一个特别的串口通讯

背景 设备是EPICS流式细胞仪,这个设备的控制系统是在DOS系统上的。数据存储在硬盘上,不带串口通讯功能。我们遇到了这个设备后,就开发了一个DOS下的执行程序通过串口,将最新的数据自动上传到服务器上。 编译工具 Turbo C 数据…

4.系统学习-集成学习

集成学习 前言Bias and Variance过拟合(overfitting)与欠拟合(underfitting)集成学习为什么有效?Blending 模型集成Stakcing 模型集成Bagging模型集成Bagging 模型集成算法流程:Boosting模型集成作业 前言 …

电商项目高级篇07-redisson分布式锁

redisson分布式锁 1、引入maven依赖2、config类3、可重入锁设计 1、引入maven依赖 <!--引入redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></depend…

Nginx的性能分析与调优简介

Nginx的性能分析与调优简介 一、Nginx的用途二、Nginx负载均衡策略介绍与调优三、其他调优方式简介四、Nginx的性能监控 一、Nginx的用途 ‌Nginx是一种高性能的HTTP和反向代理服务器&#xff0c;最初作为HTTP服务器开发&#xff0c;主要用于服务静态内容如HTML文件、图像、视…

递归算法常见问题(Java)

问题&#xff1a;斐波那契数列,第1项和第2项都为1&#xff0c;后面每一项都为相邻的前俩项的和,求第n个数 解法&#xff1a;每一个数都为前俩个数之和&#xff0c;第1项和第2项都为1&#xff0c;所以写 方法f1(n)即为求第n个数&#xff0c;那么f1(n-1)为求第n-1个数&#xff0…

SpringBoot + HttpSession 自定义生成sessionId

SpringBoot HttpSession 自定义生成sessionId 业务场景实现方案 业务场景 最近在做用户登录过程中&#xff0c;由于默认ID是通过UUID创建的&#xff0c;缺乏足够的安全性&#xff0c;决定要自定义生成 sessionId。 实现方案 正常的获取session方法如下&#xff1a; HttpSe…

【流量、洪水数据下载】网站介绍和下载经验....不断更新!

EarthData 介绍 NASA:链接 数据下载 视频教程:Discover and Access Earth Science Data Using Earthdata Search 数据下载需要注册,已经被卡在邮箱验证上【2024-12-26】… Essential Climate Variables——【The Global Climate Observing System(GCOS) 介绍 其是支…

Pytorch | 利用SMI-FGRM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用I-FGSSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集SMI-FGRM介绍SMI-FGRM算法流程 SMI-FGRM代码实现SMI-FGRM算法实现攻击效果 代码汇总smifgrm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CI…

少儿编程在线培训系统:客户服务与学习支持

2.1 VUE技术 VUE它是由HTML代码&#xff0c;配上嵌入在HTML代码里面的Java代码组成的应用于服务器端的语言&#xff0c;使用VUE进行开发能够更加容易区分网页逻辑以及网页设计内容&#xff0c;让程序员开发思路更加清晰化&#xff0c;VUE在设计组件时&#xff0c;它是可以重用的…

流批一体向量化计算引擎 Flex 在蚂蚁的探索和实践

编者按&#xff1a;Flex是蚂蚁数据部自研的一款流批一体的向量化引擎&#xff0c;Flex是Fink和Velox的全称&#xff0c;也是Flexible的前缀&#xff0c;被赋予了灵活可插拔的寓意。本文将重点从向量化技术背景、Flex架构方案和未来规划三个方面展开论述。 作者介绍&#xff1a;…

upload-labs关卡记录11

先上传一个一句话木马试试&#xff0c;居然可以上传成功&#xff0c;复制图片链接&#xff0c;在另一个窗口打开&#xff1a; 会发现&#xff0c;我们明明上传的是shell.php&#xff0c;但是这里就是没有了php,这样我们在执行我们相关的语句的时候就无法执行了&#xff1a; 就…