坚持写博客💪,分享自己的在学习、工作中的所得
- 给自己做备忘
- 对知识点记录、总结,加深理解
- 给有需要的人一些帮助,少踩一个坑,多走几步路
尽量以合适的方式排版,图文兼有
如果写的有误,或者有不理解的,均可在评论区留言
如果内容对你有帮助,欢迎点赞 👍 收藏 ⭐留言 📝。
虽然平台并不会有任何奖励,但是我会很开心,可以让我保持写博客的热情🙏🙏🙏
🧁在图片中添加汉字
🧁在图片中添加汉字
目标检测的结果需要画到图片上,但是使用OpenCV在图片上画出目标框时,由于类别需要显示中文,而出现乱码。
目前OpenCV暂时没找到解决的方法,使用pillow代替解决
安装pillow
pip install pillow
下载字体,我从GitHub下载字体。
将其中的微软雅黑.ttf
复制到工程下。我这里改名为MS YaHei.ttf
,其实不改名也是可以的。
实现了以下:
- 支持中文;
- 类别带背景填充,避免文字颜色与图片背景相近而不易辨识;
- 每个类别使用不同颜色区分。
代码
import random
from PIL import Image, ImageFont, ImageDraw
random.seed(42)
def draw_boxes(pil_image, boxes, colors, line_thickness=None):
"""
pil_image: pillow读取的图片数据;
boxes: 框的左上角点,右下角点,类别(中文),置信度;
colors: 所有类别对应的颜色
line_thickness: box的线宽,不传值则按图片宽高来计算
"""
font = ImageFont.truetype(r"./微软雅黑.ttf", 28, encoding="utf-8") # 将微软雅黑.ttf字体改名为MS YaHei.ttf,不改名其实也可以。使用其他字体,中文可能会出现乱码
fs = font.size
tl = line_thickness or round(0.002 * sum(pil_image.size) / 2) # 计算框的线宽
draw = ImageDraw.Draw(pil_image)
for box in boxes:
x1, y1, x2, y2, cls, conf = box
color = colors[cls]
conf = f' {conf:.2}'
text = f'{cls}{conf}'
w0 = round(len(conf) * fs * 0.5) # 确保背景宽于数字英文
w1 = len(cls) * fs # 汉字宽度
w = w0 + w1 # 计算文字的背景宽度。 1. 与框同宽; 2. 分别计算汉字和数字英文
draw.rectangle(((x1, y1),(x2, y2)), fill=None, outline=color, width=tl)
draw.rectangle(((x1, y1-fs),(x1+w, y1)), fill=color)
draw.text((x1, y1-fs-tl), text, (225, 255, 255), font=font)
return pil_image
classes = ['衣柜', '沙发', '拖鞋']
colors = {cls: (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) for cls in classes}
boxes = [[30, 20, 150, 180, '衣柜', 0.85325], [300, 200, 550, 680, '沙发', 0.88325], [930, 20, 1080, 180, '拖鞋', 0.8325], [2400, 50, 2548, 180, '拖鞋', 0.8325]]
img_path = r"E:\data\202112170648473340-0000000.jpg"
image = Image.open(img_path)
img = draw_boxes(image, boxes, colors)
img.save('添加中文.jpg')
如果内容对你有帮助,或者觉得写的不错
🏳️🌈欢迎点赞 👍 收藏 ⭐留言 📝
有问题,请在评论区留言
版权声明:本文为CSDN博主「ayiya_Oese」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ayiya_Oese/article/details/122846914
暂无评论