目标检测中文类别--在图片中添加汉字

坚持写博客💪,分享自己的在学习、工作中的所得

  1. 给自己做备忘
  2. 对知识点记录、总结,加深理解
  3. 给有需要的人一些帮助,少踩一个坑,多走几步路

尽量以合适的方式排版,图文兼有
如果写的有误,或者有不理解的,均可在评论区留言
如果内容对你有帮助,欢迎点赞 👍 收藏 ⭐留言 📝。
虽然平台并不会有任何奖励,但是我会很开心,可以让我保持写博客的热情🙏🙏🙏



🧁在图片中添加汉字

🧁在图片中添加汉字

目标检测的结果需要画到图片上,但是使用OpenCV在图片上画出目标框时,由于类别需要显示中文,而出现乱码。

目前OpenCV暂时没找到解决的方法,使用pillow代替解决

安装pillow

pip install pillow

下载字体,我从GitHub下载字体。
将其中的微软雅黑.ttf复制到工程下。我这里改名为MS YaHei.ttf,其实不改名也是可以的。

实现了以下:

  1. 支持中文;
  2. 类别带背景填充,避免文字颜色与图片背景相近而不易辨识;
  3. 每个类别使用不同颜色区分。

代码

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')


如果内容对你有帮助,或者觉得写的不错
🏳️‍🌈欢迎点赞 👍 收藏 ⭐留言 📝
有问题,请在评论区留言

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayiya_Oese

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值