目标检测结果xml文件显示在原图代码问题记录

由于一些平台限制,需要将模型结果下载后自行拼出显示结果,但奈何代码写好一直显示不出中文标签,后经多次尝试,找到问题,遂记录于此。

代码: 

def draw_prediction(image_path, xml_path, output_dir):
    # 读取图像
    image = cv2.imread(image_path)

    # 检查图像是否成功读取
    if image is None:
        print(f"Failed to read image: {image_path}")
        return

    # 读取 XML 文件
    tree = ET.parse(xml_path)
    root = tree.getroot()

    # 检查是否存在目标
    objects_found = False

    # 颜色、字体和比例
    color = (255, 0, 0)  # 红色
    font_size = 16
    font = ImageFont.truetype("simhei.ttf", font_size)

    # 转换为 PIL Image
    pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(pil_image)

    # 遍历 XML 文件中的每个对象
    for obj in root.findall('object'):
        objects_found = True
        # 提取对象名称和边界框坐标
        name = obj.find('name').text # 获取中文标签名称
        # 解码中文标签名称
        name = html.unescape(name)
        print(name)
        bbox = obj.find('bndbox')
        xmin = int(bbox.find('xmin').text)
        ymin = int(bbox.find('ymin').text)
        xmax = int(bbox.find('xmax').text)
        ymax = int(bbox.find('ymax').text)

        # 在图像上绘制边界框和类别名称
        draw.rectangle([(xmin, ymin), (xmax, ymax)], outline=color, width=2)
        x1 = xmin
        y1 = ymin-font.getbbox(name)[3]-10
        x2 = xmin+font.getbbox(name)[2]+20
        y2 = ymin-5

        draw.rectangle([(x1, y1), (x2, y2)], fill=color)

        text_x = x1+10
        text_y = y1+(y2-y1-font.getbbox(name)[3])//2
        draw.text((text_x, text_y), name, font=font, fill="white")
    # 转换回 OpenCV 格式
    image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

    # 保存图像
    if objects_found:
        filename = os.path.basename(image_path)
        output_path = os.path.join(output_dir, 'with_predictions', filename)
    else:
        output_path = os.path.join(output_dir, 'without_predictions', os.path.basename(image_path))

    cv2.imwrite(output_path, image_with_text)
    print(f"Processed: {output_path}")

这个是最终的可行代码,中文显示异常分两种情况:

1、没有任何显示在图中,该情况多数是代码问题,无法解析中文标签,draw函数的使用问题等。

2、显示一个字体颜色的框(大坑),该情况原因也可能是上述问题,都比较好解决,就不赘述,这情况还有一种可能,是字体的不支持!!

本代码使用的是4.9.0的opencv-python,不清楚是不是这个环境问题,由于电脑也是最近换的,不清楚电脑设置是否会有影响。

字体电脑中会有很多,原本使用的是simsun.ttf,但现在电脑中查看字体变化为了simsunb.ttf,改用后一直无法解决问题,后面改代码多次无法解决,字体最后改了一个黑体(simhei.ttf)的显示成功了!!原来是字体的问题!至于simsunb.ttf为何不支持中文显示暂时还不清楚。(2024.5.13)

后续:

经查资料,是字体的问题simsunb.ttf是宋体的一个更新版本,但是该版本的字体在许多软件中不支持正常显示,网上有大佬改进的字体包,当然,直接改字体使用是最快的。本地字体包所在路径:C:\Windows\Fonts。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值