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