使用 Monkey Patch 解决 Sahi 可视化的中文乱码问题

其实如果是对算法的输出结果进行可视化的话,使用 Pillow 库是完全没有问题的。但是存在着这样一种情况,我们调用的公共包当中,里面已经有了可视化的接口,但是使用的是 OpenCV 中的 cv2.putText 进行可视化的。正常来说,因为 OpenCv 对中文的支持不足,直接调用的话,显示在图片上的 label 名肯定是一串问号,也就是乱码,这时,就有几个选择:

  1. 自己从零实现一个可视化的功能,使用 Pillow 或者别的库进行可视化
  2. pip 安装完 Sahi 库之后,手动进入到库内修改相关的代码,将 cv2.putText 改成 Pillow 相关的方法

第一个选择虽然不是不可行,但是重复造轮子确实挺浪费时间的,至于第二个选择,对于我来说存在一个问题,因为我这个算法是要打包成 whl 安装包的,我不可能每安装一次,就去手动修改一下 Sahi 的文件,或者是替换一下它的文件,所以也只能否决了。

但是我想到第三种方法:

  1. 使用 Monkey Patch 来替换 OpenCv 的 cv2.putText 函数

之前虽然看到过 Monkey Patch 这种用法,但是一直没有遇到什么相关的场景,对它的理解也是懵懵懂懂,觉得这玩意真的有用吗?今天终于让我遇到了比较合适的场景:

无需修改公有库的源文件,就可以修改其功能。

下面给出一个初版的代码,因为并没有将 cv2.putText 的全部功能都实现了,只是实现了些基础的特性:

import types
from typing import Optional, Sequenceimport cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFontfont_path = 'SimHei.ttf'def putText(self,img: np.ndarray,text: str,org: Sequence[int],fontFace: int,fontScale: Optional[float],color: Sequence[int],thickness: Optional[float] = 1,lineType=cv2.LINE_AA,bottomLeftOrigin=True,):base_size = 30fontSize = base_size * fontScaleimg_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img_pil)fontStyle = ImageFont.truetype(font=font_path,size=int(fontSize),encoding='utf-8')draw.text(xy=(int(org[0]), int(org[1]-fontSize)),text=text,fill=color,font=fontStyle)img_cv2 = cv2.cvtColor(np.asarray(img_pil), cv2.COLOR_RGB2BGR)img[...] = img_cv2cv2.putText = types.MethodType(putText, None)

后续再使用 Sahi 进行可视化的时候,就可以正常显示中文了。

  • 参数列表的 self 是需要的,可以替换为任意的参数名,因为 OpenCv 调用的时候第一个会传入一个隐藏的参数。
  • SimHei.ttf 字体文件得自己找个地方下载一下,可以替换为别的字体
  • 因为 cv2.putText 就是原图上绘制,没有返回值得,所以我也将没有用返回值,直接将绘制得结果又放回了 img

简单的打了个小补丁,不考虑格式化的话,大概 10 左右就解决了 Sahi 中文乱码问题(虽然在大型项目中不推荐这么用,可能会考虑不周,导致可怕的后果,甚至更谨慎一点,可以将最后一行放入一个可视化的 if 语句内,只有收到可视化的指令,才使用 Monkey Patch 进行替换,将对其他可能用到 cv2.putText 函数的地方,影响降低到最小)

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

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

相关文章

地瓜网络技术综合助手教你一键下载腾讯会议高清视频

当您错过腾讯会议的直播课程,不必担心,地瓜网络技术综合助手帮您轻松获取视频回放。 只需几个简单步骤,即可在手头保留珍贵的学习资料。 首先,启动地瓜网络技术综合助手, 进行软件初始化并开启监测功能。 接下来&…

智慧乡村和美人家信息化系统

一、简介 智慧乡村和美人家信息化系统是一个综合管理平台,集成了首页概览、一张图可视化、数据填报、智能评估、便捷申报、公开公示、任务管理、活动发布和灵活配置等功能。该系统不仅提升了乡村管理效率,也优化了家庭生活的便捷性。通过一张图&#xf…

BEVM背靠比特大陆打造新赛道,算力RWA成下一个千亿市场?

众所周知,在加密行业,每隔一段时间就会有一个新的概念或者一个新词出现,并引来社区和资本的追捧关注,笔者近期在浏览新闻时,发现了一个特别有意思的新概念——算力RWA,在社区引起了不少讨论。 该词最早出现…

工时管理系统的优势及推荐

企业发展离不开每一个员工,而员工的工作效率高低也是影响着企业在行业内的竞争力,所以规范管理员工时间,提升员工工作效率势在必行。工时管理系统在现代企业中的应用越来越广泛,不仅是因为它能显著提高企业管理效率,更…

Flutter【组件】按钮

简介 flutter 按钮组件。提供一种封装按钮组件的思路,并不支持过多的自定义属性。根据使用场景及设计规范进行封装,使用起来比较方便。 github地址:https://github.com/ThinkerJack/jac_uikit pub地址:https://pub.dev/package…

IOS 关于Apple Pay 与内购

一、什么是Apple Pay、什么是内购 首先这两个不是一样的,很多人一看觉得这两是一回事,我之前也是这么想的。今天我来给大家阐述一下: Apple Pay:是指支付实物类。类似国内的微信、支付宝。支付超市食品类啥的。 内购&#xff1…

el-upload组件校验不通过预览列表依然显示图片问题解决

如图校验不通过的图片依然显示在预览列表了&#xff0c;需要在校验不通过的时候移除图片 <el-uploadclass"upload-cls":action"ossSignature.host":auto-upload"false"ref"upload":list-type"listType":limit"limi…

如何在React中使用CSS模块,并解释为什么使用它们比传统CSS更有益?

在React中使用CSS模块是一种将CSS类名局部化到单个组件的方法&#xff0c;从而避免了全局作用域中的类名冲突。CSS模块允许你为组件编写样式&#xff0c;并确保这些样式只应用于该组件&#xff0c;而不会影响到其他组件。 以下是在React中使用CSS模块的步骤&#xff1a; 安装C…

通过CSS样式来禁用href

<style>.disabled-link {pointer-events: none;cursor: default;text-decoration: none;color: inherit; }</style><a href"https://www.example.com" class"disabled-link">禁用链接</a> 在上述CSS样式中&#xff0c; pointer-…

前端项目如何规范文件命名

前端项目如何规范文件命名 ls-lint 是一个非常快的文件和目录名称 linter&#xff0c;可方便约束项目目录和文件的命名。 特点&#xff1a; 快速依赖少适用所有文件配置简单 安装依赖 npm install ls-lint/ls-lint -D 在 husky 加入 git hook:"husky": {"h…

医疗器械3D全景展会在线漫游创造数字化时代的展览新篇章

在数字化浪潮的引领下&#xff0c;VR虚拟网上展会正逐渐成为企业展示品牌实力、吸引潜在客户的首选平台。我们与广交会携手走过三年多的时光&#xff0c;凭借优质的服务和丰富的经验&#xff0c;赢得了客户的广泛赞誉。 面对传统展会活动繁多、企业运营繁忙的挑战&#xff0c;许…

日语 词汇

あつい 熱い さむい 寒い ひろい 広い せまい 狭い   おおき 大き  ちいさい 小さい おおい 多い しょう  少 はやい 早い 速い  おそい 遅い わるい 悪い たかい 高い  ひくい 低い つよい 強い よわい 弱い ふかい 深い うすい 薄い あつい …

深入浅出Git原理与Gitflow流程

1 Git原理 版本控制系统在软件开发和团队协作中扮演着至关重要的角色。它们帮助开发人员跟踪和管理代码的变化&#xff0c;协调多人同时编辑同一代码库&#xff0c;回溯历史版本&#xff0c;并解决代码冲突等问题。Git作为当今最流行的分布式版本控制系统&#xff0c;为开发人…

C++ 59 之 纯虚函数和抽象类

#include <iostream> #include <string> using namespace std;class Cal { // 类中有纯虚函数&#xff0c;这个类也叫做抽象类&#xff0c;无法实现实例化 public:int m_a;int m_b;// 虚函数// virtual int getRes(){// return 0;// }// 纯虚函数 作用和虚函数…

士兰微MEMS陀螺仪在电动升降桌上的应用

杭州士兰微电子股份有限公司&#xff0c;一家在国内集成电路芯片设计与制造领域内具有领先地位的高新技术企业&#xff0c;早已以其创新的半导体微电子产品和服务&#xff0c;赢得了市场的广泛认可。士兰微不仅致力于集成电路芯片的研发&#xff0c;而且涉猎于MEMS传感器技术领…

第7章 工程项目财务评价 作业

第7章 工程项目财务评价 作业 一单选题&#xff08;共23题&#xff0c;100分&#xff09; (单选题)企业缴纳所得税后的利润,按照下列哪一个顺序进行分配?() A. ①②③④ B. ①③②④ C. ④③②① D. ②④①③ 其中:①承担被没收的财物损失,支付各项税收的滞纳金和罚款; ②提…

torch.optim 之 distinct penalization

看torch.optim中介绍到distinct penalization: Remember that parameters() returns an iterable that contains all learnable parameters, including biases and other parameters that may prefer distinct penalization. To address this, one can specify individual pena…

Python第二语言(十三、PySpark实战)

目录 1.开篇 2. PySpark介绍 3. PySpark基础准备 3.1 PySpark安装 3.2 掌握PySpark执行环境入口对象的构建 3.3 理解PySpark的编程模型 4. PySpark&#xff1a;RDD对象数据输入 4.1 RDD对象概念&#xff1a;PySpark支持多种数据的输入&#xff0c;完成后会返回RDD类的对…

LeetCode题练习与总结:分割回文串Ⅱ--132

一、题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回符合要求的 最少分割次数 。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;1 解释&#xff1a;只需一次分割就可将 s 分割成 ["…

有关计算素数的算法

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝黑暗的笼罩更会凸显光明的可贵! 一、引言 什么是素数 素数,也被称为质数,是指在大于1的自然数中,只能被1和它本身…