当前位置: 首页 > news >正文

使用 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()

代码解析:

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

相关文章:

使用 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的系统调用经常会遇到一个概念:“内核态和用户态的切换”,一般人只会告诉你说这个切换代价很大,具体是什么情况?为什么需要切换?一定需要切换吗?怎么就会触发切换&#xff1…...

# 光速上手 - 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><!--相对路径&#xff1a;-->…...

windows 默认的消息ID有那些---我与大模型对话

前言&#xff1a; 与大模型交流&#xff0c;提问要尽量简短&#xff0c;突出关键词。否则它的回答就可能事是而非。用它总结和查资料还行&#xff0c;用它解决问题路还很远。它非常注重标准格式并机械的执行标准格式&#xff0c;并且事无巨细&#xff0c;不能灵活简要的回答问…...

CSV vs 数据库:爬虫数据存储的最佳选择是什么

介绍 在爬虫技术中&#xff0c;数据存储是一个不可缺少的环节。然而&#xff0c;选择合适的存储方式对数据分析和结果应用都致关重要。CSV和数据库是常用的两种存储方式&#xff0c;但它们各有优缺。这篇文章将分析两者在爬虫数据存储方面的选择值。 微博热搜是当前网络热点话…...

编译原理学习笔记——CH7-Runtime Environments运行时环境

本章重点&#xff1a; 为什么函数调用可以采用栈式存储&#xff1f; 函数调用和返回过程中需要记录哪些信息&#xff1f;如何记录&#xff1f; 主要知识点&#xff1a;  环境、状态、activation &#xff08;激活&#xff09; of procedures 、elaboration &#xff08;确立…...

机器学习DAY7: 特征工程和特征选择(数据预处理)(完)

本文通过特征提取、特征转换、特征选择三个过程介绍数据预处理方法&#xff0c;特征提取将原始数据转换为适合建模的特征&#xff0c;特征转换将数据进行变换以提高算法的准确性&#xff0c;特征选择用来删除无用的特征。 知识点 特征提取特征转换特征选择 本次实验的一些示…...

vue3动态加载组件

如何在Vue3中动态加载组件 需求根据下拉框的值&#xff0c;加载不同的组件 新建文件aaa.vue&#xff0c;bbb.vue <template><div class"container">我是bbbb组件</div> </template><script lang"ts" setup name"taskPus…...

12.29 redis缓存一致性

更新操作 如果先更新数据库再更新缓存 先更新缓存再更新数据库 更新缓存为1 更新缓存尾2 更新数据库为2 更新数据库为1 那么最后缓存为2 数据库为1 数据不一致 先更新数据库&#xff0c;再更新缓存 数据库为1 数据库为2 缓存为2 缓存为1 还是不一致 于是这种情况我们改为将缓…...

SqlSugar配置连接达梦数据库集群

安装达梦数据库时&#xff0c;会自动在当前操作系统中创建dm_svc.conf文件&#xff0c;可以在其中配置集群信息&#xff0c;不同操作系统下的文件位置如下图所示&#xff1a;   dm_svc.conf文件内的数据分为全局配置区域、服务配置区域&#xff0c;以参考文献1中的示例说明&…...

评分模型在路网通勤习惯分析中的应用——提出问题(1)

1、问题的由来、目标和意义 最近一段时间和公司其它业务部门讨论时&#xff0c;发现一个有趣的交通路网问题&#xff0c;车辆从S点行驶到V点共用时40分钟&#xff0c;这段时间内路网中的卡口摄像头识别到了车辆通过的信息。如下图所示&#xff1a; 设计师需要通过这些有限的路…...

使用 OpenCV 绘制线条和矩形

OpenCV 是一个功能强大的计算机视觉库&#xff0c;它不仅提供了丰富的图像处理功能&#xff0c;还支持图像的绘制。绘制简单的几何图形&#xff08;如线条和矩形&#xff09;是 OpenCV 中常见的操作。在本篇文章中&#xff0c;我们将介绍如何使用 OpenCV 在图像上绘制线条和矩形…...

npm 切换镜像源

设置镜像源 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ npm 官方原始镜像网址是&#xff1a;https://registry.npmjs.org/ 淘宝 NPM 镜像&#xff1a;https://registry.npm.taobao.org 阿里云 NPM 镜像&#xff1a;https://npm.aliyun.com 腾…...

CSS(四)display和float

display display 属性用于控制元素的显示类型&#xff0c;用的 display 值包括&#xff1a; block&#xff1a;块级元素 使元素成为块级元素&#xff0c;占据一整行&#xff0c;前后有换行宽度默认为父容器的 100%&#xff0c;可以设置宽高&#xff0c;支持 margin、padding、…...

MMaudio AI:如何通过 AI 实现精准的视频到音频合成

1. 引言&#xff1a;视频音效制作的新纪元 无论是短视频创作者还是电影后期制作团队&#xff0c;音效始终是提升作品质量的关键。然而&#xff0c;手动调整音效不仅耗时&#xff0c;还容易出错。试想&#xff0c;如果一项 AI 技术能够根据视频内容自动生成与画面完美同步的音效…...

SQL进阶技巧:如何分析双重职务问题?

目录 0 背景描述 1 数据准备 2 问题分析 方法2:利用substr函数,充分利用数据特点【优秀解法】 3 小结...

OpenCV相机标定与3D重建(37)计算两幅图像之间单应性矩阵(Homography Matrix)的函数findHomography()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到两个平面之间的透视变换。 cv::findHomography 是 OpenCV 库中用于计算两幅图像之间单应性矩阵&#xff08;Homography Matrix&#xff09;的…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...