链接:https://pan.baidu.com/s/1iEJKpqt-z_5yBJdenUABbA
提取码:uoox
先把这个文件拿了,这个文件是一个ttf的字体,用于显示中文。
核心代码👑
def cv2AddChineseText(self, img_ori, text, p1, box_color, textColor=(255, 255, 255), textSize=17):
if (isinstance(img_ori, np.ndarray)): # 判断是否OpenCV图片类型
img = Image.fromarray(cv2.cvtColor(img_ori, cv2.COLOR_BGR2RGB))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(img)
# 字体的格式
fontStyle = ImageFont.truetype(
"simsun.ttc", textSize, encoding="utf-8")
# 绘制文本
text_width, text_height = draw.textsize(text, font=fontStyle)
position = []
outside_x = p1[0] + text_width + 3 < img.width
outside_y = p1[1] - text_height - 3 >= 0
position.append(p1[0] + 3 if outside_x else img.width - text_width)
position.append(p1[1] - text_height - 3 if outside_y else p1[1] + 3)
p2 = (position[0] + text_width, position[1] + text_height)
image = cv2.rectangle(img_ori, position, p2, box_color, -1, cv2.LINE_AA) # filled
img = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
draw.text((position[0], position[1]), text, textColor, font=fontStyle)
# 转换回OpenCV格式
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
def draw_boxs(self, boxes, image):
for res in boxes:
box = [res[0], res[1], res[2]+res[0], res[3]+res[1]]
label = self.labels[res[4]]
conf = round(res[5], 4)
box = np.array(box[:4], dtype=np.int32) # xyxy
line_width = int(3)
txt_color = (255, 255, 255)
box_color = (58, 56, 255)
p1, p2 = (box[0], box[1]), (box[2], box[3])
image = cv2.rectangle(image, p1, p2, box_color, line_width)
tf = max(line_width - 1, 1) # font thickness
box_label = '%s: %.2f' % (self.get_desc(label), conf)
image = self.cv2AddChineseText(image, box_label, p1, box_color, txt_color)
return image
一共两个函数def draw_boxs和def cv2AddChineseText,主函数是def draw_boxs,传入参数是boxes和image,不必多说
①boxes->预测结果[xmin, ymin, w, h,conf, cls]->[左上角坐标x,左上角坐标y,宽度,长度,置信度,类别]
②image->原图[cv2/numpy.array]。
两个函数的作用以及他们之间的关联如下:
NOTE:代码中的self.label是一个映射字典,代码中没有给出,只是调用了,需要自行补充。